Forum: PC Hard- und Software Embedded Linux serial Port Hex


von Hate M. (hate)


Lesenswert?

Hallo,

ich habe folgendes Problem und hoffe mir kann einer weiterhelfen.

Es sollen Daten über einen Embedded Linux Controller an einen Sensor 
gesendet werden. Sind die Daten korrekt, antwortet der Sensor mit einem 
Response Prtc.
-> Schnittstelle RS232.

Datenpaket Senden sind : 5Bytes Hex codiert (binary) NICHT String.
Datenpaket Empfangen sind: 50 Bytes HEX codiert (binary)

Versuch 1:
----------
Serielle Schnittstelle beim Emd.Linux (dev/ttySX)
Rx und Tx habe ich erst mal gebrückt um meinen Code zu testen.

Habe einen C Code geschrieben wo die Daten alle 30ms gesendet und 
gelesen werden.

wie erwähnt Rx und Tx gebrückt, die gesendeten Daten werden empfangen.

alles gut

Versuch 2:
----------
nun Versuche ich über den Embedded Linux dieses Prtc seriell an den PC 
Windows zu senden. Software zum auslesen => Putty oder TeraTerm.
Daten werden in putty empfangen. Prüfe diese Daten mit einem ASCII to 
hex Converter und das gesendetet Prtc stimmt überein.

Versuche 3:
-----------

python script geschrieben (windows) gleiches wie bei Versuch1.
Nun sende und empfange ich über den Windows ComPort direkt an den 
Sensor. ==> Kommunikation besteht. Daten werden empfangen.

Versuch 4:
----------

Für mich stellt sich jetzt die Frage warum der C Code nicht 
funktioniert.
Nun habe ich versucht über das Python script vom Embedded Controller an 
den Pc zu senden (Putty). Daten werden gesendet.
Habe beide gesendeten Daten also einmal vom C code und einmal vom python 
script  überprüft und beide sind identisch.

würde der C code nicht funktionieren, dann würde ich ja bei Versuch 1 
schon nichts erhalten. Aber dies funktioniert ja.



Also nun die Frage, warum kann ich über den Embedded Linux Controller 
den Sensor nicht ansprechen obwohl das Sende Prtc richtig zu sein 
scheint. Und über den PC funktioniert dies.
Der embedded Linux Controller ist ein ARM.
Habe ich etwas grundlegendes Vergessen?.

Vielen Dank

von Peter II (Gast)


Lesenswert?

Hate M. schrieb:
> Habe ich etwas grundlegendes Vergessen?.

lies doch einfach die Daten mit die gesendet werden. Dazu einfach den PC 
einmal auf die RX und einmal auf die TX Leitung klemmen (oder bei 2 
Schnittstellen auf beide gleichzeitig).

Dann siehst du was auf der Leitung los ist.

von Hate M. (hate)


Lesenswert?

Ich habe parallel über putty die sende Daten ausgelesen und es das sende 
prtc ist richtig.
Muss ich evtl bei EMBEDDED Linux auf die lineendings achten.

von nicht"Gast" (Gast)


Lesenswert?

Das ist ganz klar. Der Fehler liegt in Zeile 42.

Hate M. schrieb:
> Muss ich evtl bei EMBEDDED Linux auf die lineendings achten.

Da du die Daten binär schickst. Solltest du auf keine LF schauen. Las 
mal Code rüber wachsen und dann kann man dir evtl auch helfen.

von Hate M. (hate)


Angehängte Dateien:

Lesenswert?

nicht"Gast" schrieb:
> Das ist ganz klar. Der Fehler liegt in Zeile 42.
>
> Hate M. schrieb:
>> Muss ich evtl bei EMBEDDED Linux auf die lineendings achten.
>
> Da du die Daten binär schickst. Solltest du auf keine LF schauen. Las
> mal Code rüber wachsen und dann kann man dir evtl auch helfen.

Entschuldige. Hier der Code

von nicht"Gast" (Gast)


Lesenswert?

Puh,


ich bin mal ehrlich. Dein Code ist ein riesiger Haufen Mist :). Der ist 
sicher aus verschiedenen Quellen zusammenkopiert.

Teile ihn erst mal auf. So kann man vernünftig keine Fehler drin suchen. 
Nach dem Aufteilen sollte deine Funktion so aussehen.

1
char request[] = {0xde,0x01,0x05,0x59,0x83}
2
char readBuffer[50];
3
4
int fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
5
6
setup_port(fd);
7
8
send_request(fd, request);
9
10
read_answer(fd,readBuffer);  // hier so lange lesen, bis 50bytes gelesen wurden
11
12
process_answer(readBuffer);

Fehlerbehandlung musst du natürlich auch machen. Das ganze in der Form 
aufteilen bring sehr viel Übersicht in die Sache und du kannst dich um 
den Fehler besser kümmern.


Ich hab leider hier grad kein Linux um den Code zu debuggen.

von Peter II (Gast)


Lesenswert?

Hate M. schrieb:
> Ich habe parallel über putty die sende Daten ausgelesen und es das sende
> prtc ist richtig.
> Muss ich evtl bei EMBEDDED Linux auf die lineendings achten.

du musst das senden was der Sensor braucht. Das gibt es keinen 
unterschied von welchen System du sendet. Deswegen sollte du ja parallel 
mitlesen um zu sehen was wirklich gesendet wird. Das vergleichst du mit 
der DOKU und schaut wo eventuell Fehler sind.

von Hate M. (hate)


Lesenswert?

Peter II schrieb:
> Hate M. schrieb:
>> Ich habe parallel über putty die sende Daten ausgelesen und es das sende
>> prtc ist richtig.
>> Muss ich evtl bei EMBEDDED Linux auf die lineendings achten.
>
> du musst das senden was der Sensor braucht. Das gibt es keinen
> unterschied von welchen System du sendet. Deswegen sollte du ja parallel
> mitlesen um zu sehen was wirklich gesendet wird. Das vergleichst du mit
> der DOKU und schaut wo eventuell Fehler sind.

Wie erwähnt es gibt noch ein python script, über das ich das selbe mache 
wie beim c code. (Serial.write usw)

Wenn ich dieses Script auf dem Rechner aufrufe (PC<-->Sensor) werden 
Daten ausgetauscht.
Wird dieses Script auf dem embedded controler aufgerufen funktioniert es 
nicht. Also mein Empfangspuffer bleibt leer. Es werden Datenpakete 
gesendet alle x Sekunden.

von Peter II (Gast)


Lesenswert?

Hate M. schrieb:
> Wenn ich dieses Script auf dem Rechner aufrufe (PC<-->Sensor) werden
> Daten ausgetauscht.
> Wird dieses Script auf dem embedded controler aufgerufen funktioniert es
> nicht. Also mein Empfangspuffer bleibt leer. Es werden Datenpakete
> gesendet alle x Sekunden.

irgendwo ist der Fehler! Dann musst du beiden Übertragungen halt 
vergleichen um den unterschied zu sehen.

Baudrate, Parität, Stoppbits usw. Dann muss auch noch der Inhalt 
stimmen.

von Hate M. (hate)


Lesenswert?

nicht"Gast" schrieb:
> Puh,
>
>
> ich bin mal ehrlich. Dein Code ist ein riesiger Haufen Mist :). Der ist
> sicher aus verschiedenen Quellen zusammenkopiert.
>
> Teile ihn erst mal auf. So kann man vernünftig keine Fehler drin suchen.
> Nach dem Aufteilen sollte deine Funktion so aussehen.
>
>
>
1
> char request[] = {0xde,0x01,0x05,0x59,0x83}
2
> char readBuffer[50];
3
> 
4
> int fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
5
> 
6
> setup_port(fd);
7
> 
8
> send_request(fd, request);
9
> 
10
> read_answer(fd,readBuffer);  // hier so lange lesen, bis 50bytes gelesen 
11
> wurden
12
> 
13
> process_answer(readBuffer);
14
>

Danke für das positive Feedback :).
Ja ist aus mehreren Teilen herauskopiert.
Das ist mein erster Code in C. Deshalb ein bisschen Gnade.
Mal abgesehen von der sauberen Trennung sollte der Code schon 
funktionieren bzw. funktioniert auch. Wie gessagt wenn ich Rx und Tx 
verbinde (Hardware Echo) dann Empfange ich auch die gesendeten Daten 
(diese 5 Bytes).

von Hate M. (hate)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe nun einen anderen c Code der evtl. etwas besser aufgeteil ist. 
Jedoch habe ich immer noch das gleiche verhalten.

Des weiteren das python script. Mit diesem Script funktioniert die 
Verbindung zwischen PC und Sensor über RS232. Wird dieses Script auf dem 
Embedded Linux aufgerufen werden keine Daten empfangen. (len == 0)
1
import serial
2
import binascii
3
from time import sleep
4
5
ser = serial.Serial('COM1', 115200, timeout=1)
6
'''ser = serial.Serial('/dev/ttyS1', 115200, timeout=1)'''
7
8
if(ser.isOpen()):
9
    print'serial is not open'
10
11
while True:
12
    
13
    ser.write([0xde, 0x01, 0x05, 0x59, 0x83])
14
    reply = ser.read(100)
15
16
    if len(reply) == 0:
17
        print'length = LEER'
18
        #break
19
20
print'Serial close'
21
ser.close()


...des weiteren habe ich mal getestet ob die Daten korrekt vom einem 
Rechner zu einem anderen Rechner funktionieren.

Auf dem 2ten Rechner läuft ein C# Projekt das die Daten ausließt.
Nun ist es so, dass Daten also hex werte ab (0x7F) bzw dez.127 nicht 
korrekt angezeigt werden.
Das Python Script hat Codierung UTF-8 ohne BOM. Ich weiß jedoch nicht ob 
dieses Verhalten etwas mit dem eigentlich Problem zu tun hat. Das Python 
Script funktioniert wie gesagt (PC<-->Sensor) einwandfrei.

Vielen Dank

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Hänge einen Logicanalyzer in die serielle Verbindung rein. Nur so weißt 
Du, was da tätsächlich abgeht.

Du hast keinen?

ebay# 181767474651

Am Geld kann es nicht scheitern.

fchk

von Gogo (Gast)


Lesenswert?

Saleae

LOL;-)

von Peter II (Gast)


Lesenswert?

Hate M. schrieb:
> Auf dem 2ten Rechner läuft ein C# Projekt das die Daten ausließt.
> Nun ist es so, dass Daten also hex werte ab (0x7F) bzw dez.127 nicht
> korrekt angezeigt werden.

vermutlich ließt du einen String - du musst ein Byte Array lesen.

von Hate M. (hate)


Lesenswert?

Peter II schrieb:
> Hate M. schrieb:
>> Auf dem 2ten Rechner läuft ein C# Projekt das die Daten ausließt.
>> Nun ist es so, dass Daten also hex werte ab (0x7F) bzw dez.127 nicht
>> korrekt angezeigt werden.
>
> vermutlich ließt du einen String - du musst ein Byte Array lesen.

Das ist denke ich mein Problem. Der Code sollte eigentlich einen Array 
of Hex auslesen. Jedoch bleibt der Puffer leer.

Sende ich über das Script einen String funktioniert es.

Evtl. liegt hier irgendwo der Fehler ich finde ihn einfach nicht

Vielen Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.