PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Byte empfangen über RS232



TobiasBlome
17.07.2011, 18:12
Hallo,
ich möchte 10 werte = 10 Byte von einem µC zum anderen senden.
Es sind immer 10 Werte und es sendet immer der selbe µC.

Am Anfang sende ich "250" als Start, dann die 10 DatenBytes und dann Wert "251"



Dim Test(10) As Byte 'als Array
Dim C As Byte
'---
Do

For C = 1 To 10
Test(c) = C 'fill array
Next

Print Chr(250); 'zum starten
Printbin Test(1) ; 10 'hier die Daten
Print Chr(251); 'Ende


Wait 2


Loop

End


Das funktioniert und ich kann die Daten am PC sehr schön sehen!

Nun der Empfang:

Wert 250 wird empfangen und setzt Variable N auf "0"
Bei jedem empfangenem Byte wird N um 1 hochgezählt
und "E_byte" wird in "Test(N)" übertragen.
Wird 251 empfangen soll die Variable z.B. "Test(3)" auf dem LCD angezeigt werden.
Leider wir nur T:T:T:T:T:T:T:T:T:T:T:T: angezeigt....

Was muss ich ändern?
Tobias



Dim N As Byte
Dim Test(10) As Byte 'als Array

'Für RS232:
On Urxc Onrxd 'Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen

Do

Loop
End


Onrxd:
Incr N

E_byte = Udr

Select Case E_byte
Case 250 : N = 0 'Empfang starten
Cls
Case 251 : Lcd "T:" ; Test(3) 'Empfang beenden

Case Else : Test(n) = E_byte

End Select


Return

TobiasBlome
17.07.2011, 18:50
Der Empfang klappt - aber nur einmal...

Ich sende 1 mal pro Sekunde 10 neue Werte. Leider zeigt der Empfänger keine Veränderung.
Die Variable "N" hat immer den Wert 14!

Tobias

Searcher
17.07.2011, 19:57
Hallo,
ein PRINT sendet immer noch ein CR LF von sich aus hintendran.

Mit Print Chr(250); geht 0xFA 0x0D 0x0A über die RS232 raus.
Der Zähler N wird mit 250 auf 0 gesetzt und mit dem CR LF geht er auf 2
Es folgen 10 Byte durch Printbin und Zähler N ist auf 12.
Mit Print Chr(251); müßte im Empfänger N auf 15 gezählt werden; vielleicht wird durch das Lcd Kommando da der Empfang eines Zeichens verhindert oder der Indexüberlauf von test(n) zerstört etwas.

Statt PRINT könntest Du PUT benutzen.

Soweit meine Theorie.

Gruß
Searcher

TobiasBlome
17.07.2011, 22:29
Hallo,
das ist nicht ganz richtig:
Der Printbefehl sendet grundsätzlich CR & LF mit. Durch das ";" hinter dem Printbefehl wird das verhindert.
Deshalb das ";" am Ende: Print Chr(250);

Aber davon abgesehen wartet der Empfänger bis 251 gesendet wird und zählt nicht die eingehenden Pakete ab.

Da muss noch etwas anderes sein.

Tobias

Searcher
18.07.2011, 08:54
Hallo,


Der Printbefehl sendet grundsätzlich CR & LF mit. Durch das ";" hinter dem Printbefehl wird das verhindert.
Stimmt! Hab ich bisher nicht beachtet.

Neue Theorie:
Könnte es sein, daß Du das RS232 Signal vom Sender zum Empfangs µC noch invertieren mußt?

Ein Interface zwischen µC und PC invertiert gewissermaßen - da kommen Deine Daten gut im PC an. Wenn Sender- und Emfangs-µC direkt verbunden sind, könnte durch die Nichtinvertierung was schiefgehen. Die ankommenden Daten könnten auf dem Lcd nicht darstellbar sein. Irgendwas kommt ja an, sonst wäre N nicht auf 14?

http://de.wikipedia.org/wiki/RS-232#Datenrahmen_und_Timing

Entschuldige, wenn das Murks ist was ich geschrieben habe. Ich nehme SW-UART und wenn die Daten nicht richtig sind, kann man da im OPEN Kommando mit INVERTED die Polaritäten auf TX invertieren.


Gruß
Searcher

PicNick
18.07.2011, 08:59
Denke, dein PC-TErminal ist vifer als dein Empfangs-µC

Du schickst binäre Zeichen (&H01-&H0A). Das kann dein LCD nicht herzeigen.
Mach als Test erstmal druckbare Zeichen, zB so:


For C = 1 To 10
Test(c) = C + 47 'fill array &H30 - &H39 d.i. ascii "0" - "9"
Next



und probier's dann

TobiasBlome
18.07.2011, 16:27
merkwürdiger weise steht nun 48 49 53 54 auf dem LCD - ich habe aber die ersten 4 abgefragt... (also 48,49,50,51)

so - nun mal etwas aufwändiger:

Beide µC haben ein LCD.
Der Sender hat zusätzlich ein Poti um den Wert zu erhöhen(0-1023)
Sender LCD zeigt Poti=0; Werte sind 1,2,3,4,5,6,7,8,9,10 auf dem LCD
Am Anfang wird "250" gesendet, dann die Werte udn am Ende "251"
Am PC kann ich genau diese Kette korrekt sehen(siehe Bild).

Nun zum Empfang:
Das LCD zeigt: 1,2,6,7,8,9,10,0,0,0

In der Do...Loop steht nichts.

Onrxd:
Incr N

E_byte = Udr

Select Case E_byte
Case 250 : N = 0 'Empfang starten
Cls
Case 251 : Gosub Anzeige

Case Else : Test(n) = E_byte

End Select
Return

Anzeige:
Locate 1 , 1
Lcd Test(1)
Locate 1 , 5
Lcd Test(2)
Locate 1 , 9
Lcd Test(3)
Locate 1 , 13
Lcd Test(4)
Locate 1 , 17
Lcd Test(5)
Locate 2 , 1
Lcd Test(6)
Locate 2 , 5
Lcd Test(7)
Locate 2 , 9
Lcd Test(8)
Locate 2 , 13
Lcd Test(9)
Locate 2 , 17
Lcd Test(10)
Return

Wenn ich das Poti verändere ändern sich auch die Werte auf beiden LCD´s. Nur das bei dem Empfänger immer dieser Sprung ist.

Hardware: beide µC nutzen HW-UART 9600Baud und haben je einen MAX232 - und die Hardware läuft denke ich einwandfrei.
Der Wert "250" am Anfang wird wohl erkannt, da die Empfangsreihenfolge stimmt - die "251" wird erkannt, da sonst das empfangene nicht auf dem LCD erscheinen kann.

Tobias

PicNick
18.07.2011, 16:54
:oops: bei meiner Testgeschichte hab ich dir was unterschlagen:
da müsstes du schreiben

Lcd "T:" ; chr(Test(3) )

radbruch
18.07.2011, 16:57
Vielleicht doch mal das CLS in die Ausgabe verschieben. Was besseres fällt mir auch grad nicht ein. Sehr sonderbarer Effekt.

TobiasBlome
18.07.2011, 17:09
Vielleicht doch mal das CLS in die Ausgabe verschieben. Was besseres fällt mir auch grad nicht ein. Sehr sonderbarer Effekt.

:confused: frag mich bitte nicht was das CLS das zu suchen hat und wie es da hingekommen ist...
ja, das war der Fehler - so ein blöder Fehler...

@all: vielen Dank für eure Hilfe!!!

Tobias