PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlerhafte bytes bei Printbin



Willa
04.07.2010, 14: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

peterfido
04.07.2010, 15:39
Da könnte ein Buffer (am PC) überlaufen. Auf dem PC empfange ich immer in einen "Endlosstrig" und schneide bei einem chr(13) ab. Teste es mal mit einer längeren Pause vor dem Next.

Willa
04.07.2010, 16:03
Hi,
ich glaube nicht, dass der Buffer überläuft. Der ist standardmäßig auf ~4000 bytes eingestellt und wird ständig geleert. Eine längere Pause hatte ich bereits versucht, aber bei 38400 baud sollte der controller doch 5 bytes mit 20Hz übertragen können...?
Das Problem ist, ich weiss nicht ob mein PCProgramm nen Fehler hat, oder ob mein controller falsch sendet. Gibt es ein Terminalprogramm mit dem ich bytes loggen kann? Realterm kann zwar bytes anzeigen, speichert die Daten aber nur als ascii oder Hex. Beides kann man sich danach nicht sinnvoll angucken.

peterfido
04.07.2010, 16:25
ja, so eines habe ich mal selbst geproggt. sollte also auch in deinen möglichkeiten liegen. ansonsten gibt es tools mit logger im namen. ich glaub sogar von systernals.

Vitis
05.07.2010, 11:51
8000000Hz != Baudratenquarz ?

Willa
05.07.2010, 12:57
8000000Hz != Baudratenquarz ?
Macht das denn wirklich so viel aus...? Ich nutze sonst nur 16MHz controller... Und dort funktionierte 115200 baud ASCII übertragung bisher immer ohne irgendeinen Fehler (bzw. ich habe nie einen Fehler bemerkt). Aber ich werde mal versuchen die Baudrate hoch bzw. runterzusetzen, vielleicht hat das ja irgendeinen Effekt. Wie rechne ich aus wie lange 5 Bytes bei X baud zur Übertragung brauchen? Hat jemand die Formel im Kopf?

Richard
05.07.2010, 14:45
Lade Dir mal HTerm heruter, ist Freeware und zeigt die Daten in allen
Formaten in der Reihenfolge wie sie Kommen an. Ist sehr gut!

1 Startbit, 8 Datenbit,Pariy (kein),1 Stopbit =10 Bit. 1/(Baudrate/10)*5

sollte bei 1 / ((115200/10)*5) ~17 µs dauern wenn ich mich nicht
vertippt habe.

Gruß Richard

Richard
05.07.2010, 14:54
Lade Dir mal HTerm heruter, ist Freeware und zeigt die Daten in allen
Formaten in der Reihenfolge wie sie Kommen an. Ist sehr gut!

1 Startbit, 8 Datenbit,Pariy (kein),1 Stopbit =10 Bit. 1/(Baudrate/10)*5

sollte bei 1 / ((115200/10)*5) ~17 µs dauern wenn ich mich nicht
vertippt habe.

Gruß Richard

Vitis
06.07.2010, 12:46
nunja, die Abweichung er Baudrate war bei mir der häufigste Fehler mit solchen Auswirkungen. Bits verrutscht oder Zeichen verloren dazwischen weil die COM-Schnittstelle da nen Framing Error gesehen haben will etc.

Richard
06.07.2010, 14:05
Du könntest auch einmal den Hard und Software Stack testweise erhöhen,
nicht das Du eine Stak Overlow konstruierst, 259 Byte sind nicht gerade
viel, man weiß ja nicht was der Compiler b.z.w. das Compilierte Programm
an Stak Speicher wirklich braucht. Bascom hat aber einen Stak-Rechner
(Tools), Der könnte helfen.


Gruß Richard