Serielles COM-Netzwerk + Arduino

Ich bin neu auf dieser Seite, aber ich habe ein Problem und vielleicht können Sie mir weiterhelfen. Ich habe ein Auto-Cluster, das mit einer seriellen 0-V / + 12-V-Leitung spricht und zuhört. Mein Ziel ist es, einige zusätzliche Befehle an das Kombiinstrument zu senden. Ich verwende dafür Serial2 des MEGA und Serial zur Überwachung des gesamten Netzwerks.

Das Problem ist, dass ich noch warten muss, bis die Leitung in den Ruhezustand / stumm geht, damit meine Nachricht keine anderen Leitungen unterbricht, die von anderen Geräten im Netzwerk gesendet werden.

Das habe ich bisher:

#define Kbus Serial2
#define get_Kbus_data serialEvent2
#define Kbus_rx 17  
#define Kbus_tx 16
byte Kdata; 
uint8_t left_blinker[10]={0xD0, 0x08, 0xBF, 0x5B, 0x20, 0x00, 0x04, 0x00, 0x00, 0x18};
int time_Kbus;
void setup()
{
  pinMode(Kbus_rx,INPUT_PULLUP); 
  pinMode(Kbus_tx,OUTPUT);
  Serial.begin(9600, SERIAL_8E1); 
  Kbus.begin(9600, SERIAL_8E1);

}
void loop()
{

if(millis()- time_Kbus > 1 ) Kbus.write(left_blinker, sizeof(left_blinker));     

}
void get_Kbus_data()
{
  Kdata = Kbus.read(); 
  Serial.println(Kdata,HEX); 
//  Serial.write(Kdata); 
  time_Kbus = millis();  
}

Ich verwende zwei Optokoppler, um die richtigen 0V/+12V-Signale zu erhalten.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Ich verwende 4N35-Optos und einen 2N3904 als Q1

Eine Sache ist mir bei der Arbeit damit aufgefallen. Der Arduino sendet nicht die Anfangsnullen von, wie 0x08 als> 8 ausgeht, also erkennt das empfangende Ende es vielleicht nicht?!

Ich kann die Zeile mit dieser Schaltung und einem anderen Code lesen, aber ich habe die "Sender" -Seite davon nicht getestet.

Ich denke, das ist alles, was ich habe.

UPDATE #1 = Fehlende Verbindung zwischen den beiden Optos und der GND-Leitung behoben.

Hast du die Geschwindigkeit der Optos überprüft? sowohl der Aufstieg als auch der Fall.
Ist das Busprotokoll Ihres Clusters UART 8E1 9600. Beachten Sie, dass 8 Even unwahrscheinlich ist, wenn 8N1, 7E1 oder 7O1. Ich folge nicht der Aussage "0x08 geht als > 8 s aus"
Ich meinte, ich versuche, dies zu senden: D0 08 BF 5B 20 00 04 00 00 18 Arduino verwandelt es in Folgendes: D08BF5B20040018 „Die physikalische Schicht des Busses ist ein Open-Collector-Setup, das vom Bus hochgezogen (+12 V) und niedrig gezogen wird durch den Sprecher. Dies bedeutet, dass die normale Spannung auf dem Kabel +12 V beträgt (die Batteriespannung oder Vbatt). Ein Bit wird übertragen, indem der Bus kurzzeitig auf Low gezogen oder kurzgeschlossen wird. Dies ist das Gegenteil von vielen digitalen Signalen, bei denen Die normale Spannung beträgt 0 V und wird hoch angehoben, um ein Bit zu senden. Die serielle Kommunikation auf dem Bus beträgt 9600 bps, 8 Datenbits, gerade Parität, 1 Stoppbit."
Außer ganz am Anfang (aus D0 08 wird D0 8B) sind alle anderen Verfälschungen Verluste von "00". Ist das ein Hinweis? Ignorieren Sie mich, wenn ich blöd bin.
Es ist wie D0 ist die ID der Sendeeinheit 08 ist die Länge BF ist das Ziel und dann die eigentlichen Befehle 5B ist für den Lampenstatus und dann die Steuerbytes. 18 am Ende ist die Prüfsumme. D0 08 BF 5B 20 00 04 00 00 18 Bedeutet Folgendes: Von LCM (Light Control Module) zu Global: Lamp Status: Indicator_Left Indicator_sync All_ok Wenn also der Arduino entscheidet, dass wir diese Nullen nicht brauchen, wird es ein komplettes Durcheinander. Genauso wie wenn wir nicht auf die Kommunikationsfreigabe warten.

Antworten (3)

Ich bin mir nicht sicher, wie Sie die Diode von opto1 verdrahtet haben - ich denke, sie sollte ihre Verbindung mit dem Emitter von opto2 geerdet haben.

Wenn Sie die Schaltung nachverfolgen, haben Sie Bus-> R5-> Diode-> Transistor-> Bus - dies kann möglicherweise nichts Vernünftiges bewirken - es kann kein Strom durch diese Schaltung fließen, da es keine dritte Verbindung zu Masse oder Strom gibt.

Vielleicht haben Sie es falsch gezeichnet, aber so wie es aussieht, wird Ihnen wahrscheinlich niemand helfen, es sei denn, es wird repariert, weil niemand wirklich wissen kann, was Sie zu erreichen versuchen. Vielleicht bin ich falsch?

Geben Sie hier die Bildbeschreibung ein

wahrscheinlich sollen der Emitter von opto2 und die Kathode von opto1 mit Masse verbunden werden.
@mpflaga das habe ich gesagt, aber danke für die Bestätigung.
Ja, ich habe es falsch gemacht! :D Es ist geerdet. Die Geschwindigkeit des 4N35 beträgt tr= 7μs, tf= 7μs laut Datenblatt ist dies "High-Speed ​​Switching"

Ich glaube, Ihr Code und Ihre Schaltung senden die richtige Zeichenfolge. Wo es Ihr Empfangscode ist, werden die führenden aufgefüllten Nullen entfernt (wie aus Andys Kommentar hervorgeht).

Während Sie senden

D0 08 BF 5B 20 00 04 00 00 18

und Sie geben an, dass Sie D08BF5B20040018 erhalten, wobei es korrekt erscheint, wenn Sie dieselben Daten wie folgt arrangieren.

D0  8 BF 5B 20  0  4  0  0 18

Ich sehe Ihren Code mit:

Serial.println(Kdata,HEX); 

und würde denken, dass dies in der Ausgabe offensichtlich wäre, da der Zeilenvorschub jedes empfangene Zeichen kommentiert.

Beachten Sie, dass das empfangene Byte immer noch eine ganze Zahl ist, unabhängig davon, ob die Druckanzeige der führenden Null weggelassen wird. Um beide Nibbles einschließlich führender Nullen zu sehen, können Sie die printf-Funktion verwenden.

#include <stdio.h>
...
sprintf(charVal, "%02X", Kdata);
Serial.println(charVal);
Danke :) Jetzt habe ich die richtigen Debug-Informationen. Aber ich kann die Nachricht im Netzwerk nicht sehen. (Ich verwende ein anderes Gerät auf einem anderen Computer, um die Kommunikation zu überwachen.) Vielleicht liegt es an der Schaltung, ich werde alles noch einmal überprüfen, nur um sicherzustellen, dass es so funktioniert, wie es sein sollte.

Ich habe andere Teile des k-Bus (ibus)-Systems aufgegriffen, also scheint mir etwas an einer internen Pullup-Leitung gefehlt zu haben. Ich verwende den gleichen Code (er wurde auf einen Duemilanove portiert) und jetzt funktioniert er wie ein Zauber. Wenn jemand Hilfe bei k-bus (ibus)-bezogenen Projekten benötigt, kontaktieren Sie mich.Geben Sie hier die Bildbeschreibung ein