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.
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.
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?
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);
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.
mpflag
mpflag
Zoszko
Andi aka
Zoszko