PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Com Problem



Goldenflash
13.09.2006, 17:01
Hallo,
Ich hab mir mit Bascom 'nen Code zum senden vom AVR an den PC geschrieben und das funktioniert auch! Sieh im übrigen so aus:


$regfile = "4433def.dat"
$crystal = 4000000
$baud = 9600
Do
Print "Hello, world!";
Waitms 300
Loop
End


In meinem Code der etwas vom PC empfängt steckt aber irgendwo der Wurm :( zumindest empfängt der PC keine Antwort.


$regfile = "4433def.dat"
$crystal = 4000000
$baud = 9600
Dim i As Byte

Do
If USR.RXC = 1 Then
i = UDR
Select Case i
Case "H"
Print "HALLO"
Case "h"
Print "hallo"
Case Else
Print "Error!"
End Select
End If
Loop
End


Was mache ich falsch?
Is glaub ich nur was kleines.

Danke schonmal

Vitis
13.09.2006, 17:25
USR.RXC = 1 ... kann man so machen,
ich würd aber eher auf Interrupt dann gehen
also

on urxc Empfangsroutine
enable urxc
enable interrupts

do

loop
end

Empfangsroutine:
i = UDR
Select Case i
Case 104:
Print "HALLO"
Case 72:
Print "hallo"
Case Else
Print "Error!"
End Select
return
end


das mit den "h" und "H" möcht mir auch nicht recht gefallen, weil dein I nämlich ein Byte ist und "h" ein String von der länge eines Bytes. Ich glaub das mag Bascom so nicht haben ... versucht mal mit den ASCII-Codes

h = 104
H = 72

Goldenflash
13.09.2006, 22:01
Hm irgendwie will die ganze Sach noch nicht so ganz :(
Im Wiki hab ich folgenden Code gefunden:

Dim Outpt(24) As Byte At Anywhere Overlay
Dim Outpnt As Byte

Dim Stuff As Byte ' das Zeichen, daß ein stuffing Byte da war
Dim Messg As Byte ' das Zeichen, daß eine Message gestartet wurde

receive_one_char:
if ischarwaiting() = 1 then
Temp = Inkey()
If Stuff = 0 And Temp = "A" Then
Stuff = 1
Else
If Stuff = 1 And Temp <> "A" Then
Stuff = 0 ' Message starten
Messg = 1
Outpnt = 1

Outpt(outpnt) = Temp ' Erstes Zeichen speichern
Incr Outpnt

Else
If Messg = 1 Then

Outpt(outpnt) = Temp ' weiter Zeichen
Incr Outpnt ' speichern

End If
End If
Stuff = 0
End If
End if

Leider versteh ich ihn nicht so ganz, naja eigentlich versteh ich NULL :D.



Gibt es auch eine Möglichkeit einen kompletten String auszulesen?

danke schonmal

Vitis
13.09.2006, 22:34
hmmm ... ganze Strings .... ja klar, über INPUT

aber ... die Kiste hängt dann in der Programmzeile fest
bis die Eingabe auch wirklich beendet ist.
Das ist nicht gerade eleganter PRogrammierstil, aber es funktioniert.
eleganter gehts über den sog. Ringspeicher und Interrupts.

dim empfangstring as string * 20 ' für z.B. 20 Zeichen zu empfangen
dim empfangbytes(20) as byte at empfangstring overlay
dim zaehler as byte
zaehler=1
dim flag as byte
flag=0

on urxc zeichenempfang:
enable urxc
enable interrupts

do ' Hauptprogrammschleife
if flag=1 then
' Hier kommt dann die Stringverarbeitung rein.
endif
loop

zeichenempfang:
empfangbytes(zaehler)=udr
if empfangbytes(zaehler) = 13 then ' Bei Enter Taste Verarbeitung starten
flag=1
endif
incr zaehler
return
end


Diese Methode hat den Vorteil, das ausserhalb des Zeichenempfangs der Controller noch andere Geschichten machen kann und Programmspeicher wird auch geschont damit.