Willa
04.07.2010, 15:56
Hallo,
ich habe ein Problem mit dem Befehl "printbin". Ich möchte einfach vier bytes + crc8 checksumme per UART senden (im Moment sende ich an meinen Computer). Das senden geschieht einmal per FTDI USB-> UART Wandler und einmal drahtlos per xbee. Ob ich per Funk sende oder per Kabel macht keinen Unterschied, das Ergebnis ist gleich. Hier der gekürzte Code den ich benutze:
$regfile = "m328pdef.dat"
$framesize = 256
$swstack = 256
$hwstack = 256
$crystal = 8000000
$baud = 38400
Config Serialout = Buffered , Size = 120
Clear Serialout
Enable Interrupts
Dim Command(5) As Byte
Dim I As Byte
Do
For I = 0 To 255
Command(1) = 255 - I
Command(2) = I
Command(3) = 255 - I
Command(4) = I
Command(5) = Crc8(command(1) , 4) 'checksumme aus den ersten vier bytes berechnen
Printbin Command(1) ; 5
Waitms 50
Next
loop
Komischerweise wird der Bytearray sehr oft fehlerhaft übertragen / losgeschickt. Die checksumme stimmt manchmal während 1-2 sekunden nicht, danach fängt sie sich wieder, stimmt aber sehr oft wieder nicht. Außerdem kommt es manchmal vor, dass bytes verrutschen, also z.B. command(2) plötzlich command(3) ist. Ich dachte so etwas sei eigentlich nicht möglich - wird denn nicht vor dem bytearray eine startmarkierung gesendet, und danach noch eine stoppmarkierung? Wie kann das dann verrutschen? Hat jemand einen Tipp wie ich eine zuverlässige und fehlerfreie UART Verbindung für 4 Bytes hinbekomme...?
Vielen Dank für eure Tipps...!
Zur vollständigkeit: Ich empfange die Daten per VB.NET, mit folgenden Befehlen:
'bytearray "input" mit den 5 Bytes füllen
serialport1.Read(input,1,5)
'crc8 berechnen (code aus Bascom Hilfe):
unction Docrc8(ByVal s As String) As Byte
Dim j As Byte
Dim k As Byte
Dim crc8 As Byte
Dim m As integer
Dim x As integer
crc8 = 0
For m = 1 To Len(s)
x = Asc(Mid(s, m, 1))
For k = 0 To 7
j = 1 And (x Xor crc8)
crc8 = Fix(crc8 / 2) And &HFF
x = Fix(x / 2) And &HFF
If j <> 0 Then
crc8 = crc8 Xor &H8C
End If
Next k
Next
Docrc8 = crc8
End Function
ich habe ein Problem mit dem Befehl "printbin". Ich möchte einfach vier bytes + crc8 checksumme per UART senden (im Moment sende ich an meinen Computer). Das senden geschieht einmal per FTDI USB-> UART Wandler und einmal drahtlos per xbee. Ob ich per Funk sende oder per Kabel macht keinen Unterschied, das Ergebnis ist gleich. Hier der gekürzte Code den ich benutze:
$regfile = "m328pdef.dat"
$framesize = 256
$swstack = 256
$hwstack = 256
$crystal = 8000000
$baud = 38400
Config Serialout = Buffered , Size = 120
Clear Serialout
Enable Interrupts
Dim Command(5) As Byte
Dim I As Byte
Do
For I = 0 To 255
Command(1) = 255 - I
Command(2) = I
Command(3) = 255 - I
Command(4) = I
Command(5) = Crc8(command(1) , 4) 'checksumme aus den ersten vier bytes berechnen
Printbin Command(1) ; 5
Waitms 50
Next
loop
Komischerweise wird der Bytearray sehr oft fehlerhaft übertragen / losgeschickt. Die checksumme stimmt manchmal während 1-2 sekunden nicht, danach fängt sie sich wieder, stimmt aber sehr oft wieder nicht. Außerdem kommt es manchmal vor, dass bytes verrutschen, also z.B. command(2) plötzlich command(3) ist. Ich dachte so etwas sei eigentlich nicht möglich - wird denn nicht vor dem bytearray eine startmarkierung gesendet, und danach noch eine stoppmarkierung? Wie kann das dann verrutschen? Hat jemand einen Tipp wie ich eine zuverlässige und fehlerfreie UART Verbindung für 4 Bytes hinbekomme...?
Vielen Dank für eure Tipps...!
Zur vollständigkeit: Ich empfange die Daten per VB.NET, mit folgenden Befehlen:
'bytearray "input" mit den 5 Bytes füllen
serialport1.Read(input,1,5)
'crc8 berechnen (code aus Bascom Hilfe):
unction Docrc8(ByVal s As String) As Byte
Dim j As Byte
Dim k As Byte
Dim crc8 As Byte
Dim m As integer
Dim x As integer
crc8 = 0
For m = 1 To Len(s)
x = Asc(Mid(s, m, 1))
For k = 0 To 7
j = 1 And (x Xor crc8)
crc8 = Fix(crc8 / 2) And &HFF
x = Fix(x / 2) And &HFF
If j <> 0 Then
crc8 = crc8 Xor &H8C
End If
Next k
Next
Docrc8 = crc8
End Function