PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Intputbin - ein paar Fragen...



Willa
28.03.2009, 13:28
Hallo!
Ich möchte von einem Gerät (µC oder PC) Daten zu einem Mega32 übertragen. Das ganze muss so schnell wie möglich und für den Empfänger so ressourcenschonend wie möglich geschehen.
Übertragen möchte ich folgende Bytes:
Motor1Soll Motor2Soll Motor3Soll Checksumme

Die Checksumme wäre z.B. einfach Motor1Soll+Motor2Soll+Motor3Soll, oder?
Was aber wenn die Checksumme durch die Addition größer als 255 wird...?

Ich habe noch mehr Verständnisprobleme:
Wenn ich im µC die Daten so abfrage:

dim Message(4) as Byte
If Ischarwaiting() > 0 Then
Inputbin Message(1) , 4
End If

dann werden immer 4 Bytes eingelesen. Falls aber irgendwann mal eins verschluckt wurde, dann bleibt das ganze dauerhaft verschoben, richtig?
Und wenn zufällig mal 2 Bytes gesendet werden und danach gar nichts mehr, dann wartet der Empfänger ewig bis die fehlenden 2 Bytes nachgereicht werden.

Wie löst man diese Probleme programmiertechnisch...? Da steht grad jemand ziemlich auf meiner Leitung...

for_ro
28.03.2009, 14:11
Hallo!
Was aber wenn die Checksumme durch die Addition größer als 255 wird...?
Macht nichts, das passiert beim Empfangen ja auch. Also einfach den Byte-Wert übertragen.


Ich habe noch mehr Verständnisprobleme:
Wenn ich im µC die Daten so abfrage:

dim Message(4) as Byte
If Ischarwaiting() > 0 Then
Inputbin Message(1) , 4
End If


Ich mach's immer so:
While Ischarwaiting() > 0
var=inkey()
Wend

Wenn nichts mehr vorliegt, fliegt er aus der Schleife raus.

Gruß

Rolf

Willa
28.03.2009, 16:05
Hi!
Damit kann ich dann aber auch erstmal nur ein byte einlesen. Natürlich könnte ich alles in nem String verpacken, aber ich dachte einzelne Bytes gehen schneller zu übertragen. Einen String muss ich ja auch erst wieder aufteilen und dann die einzelne Teile wieder in Bytes umwandeln...
Irgendwie komme ich nicht weiter, mein Gehirn läuft aber heute auch maximal auf Standgas...
Das hier möchte ich, bekomme es aber nicht hin:

Wenn ein Byte empfangen wurde dass der Startcodierung entspricht (z.B.255),
dann die folgenden drei Bytes in ein ByteArray einlesen,
das Checksum Byte einlesen,
aus dem ByteArray die Checksum berechnen,
empfangene Checksum mit berechneter vergleichen.
Wenn beide identisch sind, dann
Motor1=ByteArray(1)
Motor2=ByteArray(2)
Motor3=ByteArray(3)
Durchlauf fertig.

for_ro
28.03.2009, 16:37
Ich dachte, das wäre klar:

index=1
While Ischarwaiting() > 0
var(index)=inkey()
incr index
Wend

Willa
28.03.2009, 18:42
Das habe ich mir schon so gedacht. Allerdings habe ich halt Probleme damit eine Startcodierung zu verwursten. Sonst verschiebt sich ja irgendwann mal der Index... Ach Mensch, wieso ist das heute so kompliziert....

Willa
28.03.2009, 20:29
Ich habe jetzt eine sehr einfache und zufriedenstellende Lösung gefunden die sehr schnell läuft. Erst wird ein Byte mit der Adresse empfangen. Diese ist entweder 253, 254 oder 255. Danach wird das Byte zur Motorsteuerung übertragen (dieses Byte wird immer zwischen 0 und 252 liegen). Ich glaube ich werde auch ohne Checksum keine Probleme mit Übertragungsfehlern bekommen. Wenn ich mit 200Hz Daten übertrage läuft mein µC statt mit 357 Hz noch mit 320 Hz. Das ist gut genug, da ich wohl nur mit max 10Hz Daten übertragen werde.
Wenn ich die Baud Rate auf 115200 erhöhe sind es sogar nur 12 Hz Unterschied.


$regfile = "m32def.dat"
$framesize = 64
$swstack = 64
$hwstack = 64
$crystal = 16000000
$baud = 38400
Config Serialin = Buffered , Size = 20
Enable Interrupts

Dim Recipient As Byte
Dim Message1 As Byte
Dim Message2 As Byte
Dim Message3 As Byte
Const Address1 = 253
Const Address2 = 254
Const Address3 = 255

Do
If Ischarwaiting() > 0 Then
If Recipient <> Address1 And Recipient <> Address2 And Recipient <> Address3 Then
Inputbin Recipient
End If
End If

If Recipient = Address1 Then
If Ischarwaiting() > 0 Then
Inputbin Message1
Print Recipient ; " " ; Message1
Recipient = 0
End If
End If

If Recipient = Address2 Then
If Ischarwaiting() > 0 Then
Inputbin Message2
print recipient;" ";message2
Recipient = 0
End If
End If

If Recipient = Address3 Then
If Ischarwaiting() > 0 Then
Inputbin Message3
Print Recipient ; " " ; Message3
Recipient = 0
End If
End If
Loop