Forum: Mikrocontroller und Digitale Elektronik Arduino 2560 Serial Signale invertieren


von Alex C. (alex087)


Angehängte Dateien:

Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

Läuft deine externe Schnittstelle evtl. auf 0V/12V oder -12V/+12V, und 
du kommst mit deinem Inverter auf nur 0V/5V?

edit: sorry, du schreibst ja die Bedienheinheit hat auch 0V/5V. Daran 
kann es also vermutlich nicht liegen.

Trotzdem:

Poste doch mal den ganzen Schaltplan, incl. dem 2. Inverter, und einem 
Hinweis, wo der Arduino angeschlossen ist (ich nehme an, am Signal ganz 
rechts in deinem ersten Posting).

von Alex C. (alex087)


Angehängte Dateien:

Lesenswert?

Ja genau alles mit TTL 5V außer die Spannungsversorgung.

Der eine Schaltplan zeigt den Aufbau mit der Bedieneinheit und der
andere den testaufbau, bei dem die Signale nur zwischen Serial 1 und
Serial 2 hin und her geschickt werden.

von Joe F. (easylife)


Lesenswert?

Hier hatte jemand schon mal ähnliche Probleme, vielleicht hilft dir sein 
Lösungshinweis ja auch:

Beitrag "Re: Inverted-TTL-serial nach nicht invertiert-TTL-serial"

ganzer Thread:
Beitrag "Inverted-TTL-serial nach nicht invertiert-TTL-serial"

von spess53 (Gast)


Lesenswert?

Hi

>Ich hab ein Bedieneinheit welches unter folgenden Eigenschaften Signale
>sendet/empfängt: ....

Gibt es dazu eine auch eine Beschreibung?

Hört sich irgendwie krank an.

MfG Spess

von Alex C. (alex087)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Ich hab ein Bedieneinheit welches unter folgenden Eigenschaften Signale
>>sendet/empfängt: ....
>
> Gibt es dazu eine auch eine Beschreibung?
>
> Hört sich irgendwie krank an.
>
> MfG Spess
 Ne leider nicht.
Aber die Kommunikation zur der bedieneinheit ist ja eigentlich auch 
nicht mein Prob sonder das ich das Signal nicht anständig zurück wandeln 
kann...

Hm das mit Software serial kann ich mal probieren, nur verstehen würd 
ichs ned :-I

von Alex C. (alex087)


Lesenswert?

Also ich hab das ganze mal an nem RS232 Port am PC getestet.
RS232 --> TTL Converter, Signal mit meiner Schaltung invertiert, 
TTL-->RS232 Converter (am PC wieder empfangen).

Gesendetes Frame:0x10 0x02 0x79 0xFF 0x10 0x03 0x9d
Erhalte nach dem invertieren: 0x67 0x1A 0x02 0x27 0x8A 0x00

Also genau das selbe wie wenn ich es am Arduino MEGA2560 rausschick.
Das ganze kann man doch sicher auch berechnen was beim invertieren 
rauskommen soll? Weiß jemand wie das geht?

Ich dachte eigentlich das Bitweise invertiert wird,
also aus 0x10 0x02 --> 0XEF 0XFD
Aber das kann ja wohl nicht der Fall sein... :-(

von Joe F. (easylife)


Lesenswert?

Achso, ich vermute dein Problem ist, dass der Eingang eigentlich ein 
nicht-invertiertes Signal erwartet.

So kann nur Unsinn herauskommen, da die Start-Stopp Bits ja auch 
invertiert sind.

von Fastgate (Gast)


Lesenswert?

Hallo.

gibt es hier was neues?

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.