PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Senden vom Controller zum PC



datatom
19.08.2011, 01:21
Hallo zusammen,

ich sende in einem Programm ständig Daten vom PC zum Controller und wieder ständig zurück. Das Senden vom PC zum Controller klappt wunderbar. Die Daten kommen auf dem Controller an und werden 1:1 zurück zum PC geschickt. Es kommen auch Daten am PC an, allerdings nicht in der richtigen Länge. z.B.: Ich sende den Wert "327LX" vom PC zum Controller. Nun erhalte ich den Wert "LX327L" zurück.

Das senden vom Controller zum PC erfolgt in der do-Schleife, also ständig. Ich kann den vom Controller gesendeten Wert nicht exakt auf dem PC greifen.

Die Länge des zu sendenden Wertes ist variabel zwischen 1 und 8 Zeichen lang.

Controller-Programm:



$prog , 255 , &B11011100 , '&B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
Config Pind.5 = Output
Led Alias Portd.5
$baud = 19200


'Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com3 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Config Com4 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Open "com1:" For Binary As #1 'RS232
'Open "com2:" For Binary As #2 'RS232
Open "com3:" For Binary As #3 'RS232
'Open "com4:" For Binary As #4 'RS232


'Dim Eingabe As Byte
Dim Eingabe As String * 10
Dim Ausgabe As String * 10


Config Porth = Output
Out1 Alias Porth.0
Out2 Alias Porth.1
Out3 Alias Porth.2
Out4 Alias Porth.3
Out5 Alias Porth.4
Out6 Alias Porth.5
Out7 Alias Porth.6
Out8 Alias Porth.7


Led = 0

Do

Input Eingabe

Print Eingabe

Led = 0
Waitms 10
Led = 1
Waitms 10
Led = 0
Waitms 10
Led = 1
Waitms 10
Led = 0
Waitms 10
Led = 1
Waitms 10
Led = 0
Waitms 10
Led = 1
Waitms 10
Led = 0
Waitms 10
Led = 1
Waitms 10
Led = 0
Waitms 10
Led = 1
Waitms 10

Loop

End


Hat jemand eine Idee woran das liegt?

Vielen Dank und Grüße

datatom

Kampi
19.08.2011, 06:19
Das liegt eventuell daran das der PC noch ein CR (ASCII 13) und LF (ASCII 10) hinterherschickt. Der einfachste Weg herauszufinden was nun wirklich gesendet wird ist indem du an die RS232 Schnittstelle deines PCs eine Brücke machst, sodass du das Empfängst was du sendest und es dir dann mal mit einem Hex-Terminal anschaust. Bei Bascom ist auch ein kleines Problem. Wenn du einen "Print" Befehl hast, sendet der "Print" Befehl am Ende automatisch noch ein CR (ASCII 13) und
LF (ASCII 10) mit. D.h. wenn du nur z.B. 8 Zeichen übertragen willst und dein Wort 8 Zeichen lang ist bekommst du so Probleme, weil durch ein einfaches "Print" 10 Zeichen übertragen werden.
Damit du aber dann nur die reinen 8 Zeichen überträgst musst du das so schreiben:

Print "Test";

und falls du dann doch nen CR brauchst so:

Print "Test" + (13);

Aber dein Problem würde ich einfach mal mit einem hinterher senden von CR und LF vermuten. Einfach mal mit einem Hex-Terminal analysieren was da gesendet wird. Das Hilft unheimlich viel.

Richard
19.08.2011, 13:23
[/CODE]

Hat jemand eine Idee woran das liegt?

Vielen Dank und Grüße

datatom




'Open "com1:" For Binary As #1 'RS232
'Open "com2:" For Binary As #2 'RS232
Open "com3:" For Binary As #3 'RS232
'Open "com4:" For Binary As #4 'RS232

Input Eingabe ' #?

Print Eingabe '#?



Fehlt da nicht die com Nummer?

Gruß Richard

Kampi
19.08.2011, 13:31
'Open "com1:" For Binary As #1 'RS232
'Open "com2:" For Binary As #2 'RS232
Open "com3:" For Binary As #3 'RS232
'Open "com4:" For Binary As #4 'RS232

Input Eingabe ' #?

Print Eingabe '#?



Fehlt da nicht die com Nummer?

Gruß Richard

Nein das geht auch so. Die COM-Nummer brauchste nur wenn du über mehrere UARTs was senden willst. Wenn du keine Nummer hinschreibt nimmt er standartmässig den ersten.
Habs gerade mal in der Simulation getestet und da gehts.

Richard
19.08.2011, 15:48
Nein das geht auch so. Die COM-Nummer brauchste nur wenn du über mehrere UARTs was senden willst. Wenn du keine Nummer hinschreibt nimmt er standartmässig den ersten.
Habs gerade mal in der Simulation getestet und da gehts.

eine Print Anweisung Im Simulator nimmt immer die Hartware RS232 im Programm werden aber Software COM Schnittstellen eingerichtet die sollten schon eindeutig zugeordnet werden, das erleichtert auch das Lesen des Codes. :-) Ansonsten Hterm ist ein sehr gutes Terminal Prog und kann ASCII, DEZ. BIN und HEX gleichzeitig anzeigen, das ist bei Fehlersuche sehr hilfreich und kostet nichts. :-)

Gruß Richard

Kampi
19.08.2011, 15:58
Oh ok wieder was gelernt :D
Aber ich denke das es trotzdem kein Fehler ist der durch die COM Schnittstelle verursacht wird. Analysier einfach mal das was der Controller und der PC senden mit nem Hex-Terminal und vergleich sie. Ich bin in Moment leider nicht Zuhause sonst würde ich auch mal gucken.
Ich vermute mal ganz stark das der Fehler in dem "Print" Befehl von Bascom steckt. Der sendet da sicher zu viel. Weil ein PC sendet, soweit ich mich richtig erinner, nur das was man auch im Terminal eingibt. Wenn man also H eingibt sendet er das. Wenn man im Bascom "Print "H" schreibt sendet der Controller H + CR + LF weil Bascom das im Compiler so hat das nach einem Text ein Zeilenumbrch kommt.

Richard
19.08.2011, 16:48
Oh ok wieder was gelernt :D
Aber ich denke das es trotzdem kein Fehler ist der durch die COM Schnittstelle verursacht wird. Analysier einfach mal das was der Controller und der PC senden mit nem Hex-Terminal und vergleich sie. Ich bin in Moment leider nicht Zuhause sonst würde ich auch mal gucken.
Ich vermute mal ganz stark das der Fehler in dem "Print" Befehl von Bascom steckt. Der sendet da sicher zu viel. Weil ein PC sendet, soweit ich mich richtig erinner, nur das was man auch im Terminal eingibt. Wenn man also H eingibt sendet er das. Wenn man im Bascom "Print "H" schreibt sendet der Controller H + CR + LF weil Bascom das im Compiler so hat das nach einem Text ein Zeilenumbrch kommt.

Das ein CRLF angehängt wird kann man mit einen ";" unterdrücken. Was ich seltsam finde, es kommt ja der richtige String aber "rückwärts"?? Jedenfgalls wenn ich das richtig gelesen habe, da scheint schon bei input Eingabe etwas nicht zu stimmen. Print Eingabe sentet deshalb etwas Falsch "gelesenes" zurück?

Gruß Richard

Kampi
19.08.2011, 17:12
Ne ich glaube das siehst du falsch ;)
Er sendet ein 327LX und erhält ein LX327L. Ich vermute das das LX327 von einer Übertragung davor stammt. Weil Bascom sendet ein 327LX plus ein CR und LF. Das sind zwei Zeichen mehr als er eigentlich erwartet und darum verschiebt sich das so.

Richard
19.08.2011, 17:36
Ne ich glaube das siehst du falsch ;)
Er sendet ein 327LX und erhält ein LX327L. Ich vermute das das LX327 von einer Übertragung davor stammt. Weil Bascom sendet ein 327LX plus ein CR und LF. Das sind zwei Zeichen mehr als er eigentlich erwartet und darum verschiebt sich das so.

Input wartet so lange auf Eingabe bis ein CR gesendet wird, Print Eingabe hängt ein CR an. Print Eingabe ; hängt nichts an.

Gruß Richard