Bascom BASCOM - Problem mit INKEY()

IN3BQX

Neues Mitglied
03. März 2015
1
0
0
77
Sprachen
Hallo -

ich möchte Zeichen aus der seriellen Schnittstelle lesen, aber ohne Wartezeit, wenn der Empfangsbuffer leer ist.
Sollte eigentlich mittels INKEY() ein Klacks sein...
(Mit ISCHARWAITING() übrigens dasselbe in Grün...)

Der untenstehende Code funktioniert - aber nicht, wenn die beiden auskommentierten Zeilen aktiv sind....

Nach 3 Stunden Kopfkratzen sehe ich den Wald vor lauter Bäumen nicht mehr ... fürchte ich ...

Vielen Dank schon mal im voraus für einen hilfreichen Tipp...

LG
Peter


$regfile = "m16def.dat"
$crystal = 16000000

Dim Rxbuffer As String * 255 ' Empfangsbuffer
Dim Txbuffer As String * 255 ' Sendebuffer
Dim I As Byte

Txbuffer = ""
Rxbuffer = ""

Ucsrb = 1 ' enable Hardware-UART

Open "comd.1:115200,8,n,1" For Output As #1
Config Serialin = Buffered , Size = 25
Open "comd.0:115200,8,n,1" For Input As #2

Do
Mainloop:
I = Inkey()
' If I > 0 Then
Input #2 , Rxbuffer
Print #1 , Rxbuffer
' End If
Loop
 
Hallo, und Willkommen in Forum.

Das hier ergibt irgendwie keinen Sinn:
...
ich möchte Zeichen aus der seriellen Schnittstelle lesen, aber ohne Wartezeit, wenn der Empfangsbuffer leer ist.
Sollte eigentlich mittels INKEY() ein Klacks sein...
Ebenso, daß Du UCSRB auf eins setzt (da werden dann alle Bits auf null gesetzt, nur TX8 oder so gesetzt - schau mal ins Datenblatt des Mega). Es hat nur deswegen keinen Effekt, weil Bascom hinterher die Schnittstelle konfguriert (config serialin), also UCSRB überschreibt.

Mir ist das mit den vorgefertigten Konstrukten den HW-UART betreffend irgendwie zu unübersichtlich - ich würde mir da dann eher selbst was zusammenstricken (also selbst die I/O-Register schreiben und lesen - ggf mittels UART Recieve Complete Interrupt).

Das ist dann natürlich eigentlich nicht der Sinn einer Hochsprache, vielleicht meldet sich hier noch ein Bascom-Profi?
 
Hallo,

ein Problem, was immer wieder auftaucht --> die Quarzfrequenz! Nicht aus jedem Quarz kann man jede Baudrate mit akzeptablem Fehler ableiten, besser geeignet ist hier ein Quarz mit 3,6864 MHz.
Aber nun zum eigentlichen Problem:
den gepufferten Empfang würde ich per Interrupt realisieren


Dim s as String*254
Dim b(255) as Byte At s Overlay
Dim z as Byte

On URXC OnRxD
Enable URXC
Enable Interrupts

'-------------

'Main

Do

'mache etwas mit dem oder den empfangenen Zeichen oder auch nicht
's enthält die empfangenen Zeichen, in z steht die Länge


Loop

'------------
OnRxD:

Incr z 'Zeiger weiterstellen
b(z) = UDR 'empfangenes Zeichen abholen; Zeichen steht in UDR

Return

'--------------------

Gruss
- gp177 -
 
Sach ich doch...

Der genannte Baudratenquarz ist aber bei 230k4baud am Ende (mit 16fach Oversampling) - der 16er könnte bis 1MBaud (allerdings weder 115k2 noch 230k4)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)