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
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.
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.
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.
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
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.
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.
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.
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.
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).
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.