Hallo zusammen,
ich hab ein Problem mit einer Seriallen-Schnittstelle.
Ich hab ein Bedieneinheit welches unter folgenden Eigenschaften Signale
sendet/empfängt:
5V TTL
8N2
Baudrate 9600
Keine Flusssteurung sendet
Tx sendet invertiert
Rx nicht invertiert
Die Frames welche gesendet werden invertiere ich mit einer einfachen
Transistorschaltung (siehe Bild)und lese Sie mit einem Arduino Mega 2560
ein.
Die Frames welche ich empfange sind soweit auch plausibel.
Aufbau: <DLE> <STX> <Data> <DLE> <ETX> <BCC>
Signal von Bedieneinheit: 0x67 0x1A 0x02 0xDF 0xF2 0xC5
Eingang des Mega2560: 0x10 0x02 0x79 0xFF 0x10 0x03 0x9d
Das Senden an die Bedieneinheit funktioniert ebenfalls.
Jetzt möchte ich gern den Arduino als Serial-Switch verwenden.
Bedeutet ich möchte die Signale welche von der Bedieneinheit kommen mal
verarbeiten und ein anderes Mal über eine andere Serialschnittstelle
raus senden.
Wenn ich die Signale allerdings weiterleite, muss ich diese nach dem
Ausgang am Mega2560 wieder zurück invertieren.
Mein Gedanke war hier "ich bau die Transistorschaltung einfach ein
zweites mal und invertiere alles wieder zurück".
Leider scheint dies nicht ganz zu klappen, da die ersten 3 Bytes in dem
Datenpaket stimmen, die letzten drei jedoch fehlerhaft sind:
Also ich sende das Datenpaket: 0x10 0x02 0x79 0xFF 0x10 0x03 0x9d
Erhalte nach dem invertieren: 0x67 0x1A 0x02 0x27 0x8A 0x00
Erwartet (bzw benötigt) hätte ich: 0x67 0x1A 0x02 0xDF 0xF2 0xC5
Invertiere ich (0x67 0x1A 0x02 0x27 0x8A 0x00) erneut zurück, empfange
ich wieder: 0x10 0x02 0x79 0xFF 0x10 0x03 0x9d
Wieso kommt es zu diesem Phänomen? Hat jemand eine Idee von euch?
Wieso wird aus 0x67 0x1A --> 0x10 0x03 müsst hier nicht stehen: 0x98
0xE5
Oder wird hier nicht Bitweise gedreht????
Um das ganze zu testen, schick ich die Signale an Serial1 raus und
empfang sie wieder am Serial2. Also komplett ohne die Bedieneinheit
Mein Code:
1 | byte Buffer[7]= {0x10, 0x02, 0x79, 0xff, 0x10, 0x03, 0x9d};
|
2 |
|
3 | void setup()
|
4 | {
|
5 | Serial.begin(9600, SERIAL_8N2);
|
6 | Serial1.begin(9600, SERIAL_8N2);
|
7 | Serial2.begin(9600, SERIAL_8N2);
|
8 |
|
9 | }
|
10 |
|
11 |
|
12 | void loop() {
|
13 |
|
14 | while(true){
|
15 | Serial1.write(Buffer,sizeof(btest));
|
16 |
|
17 | delay(500);
|
18 | Serial.println("");
|
19 |
|
20 | while(Serial2.available()){
|
21 | Serial.print(Serial2.read(),HEX);
|
22 | }
|
23 | }
|
24 | }
|
Beste Grüße
Alex