Я новичок на этом сайте, но у меня возникла проблема, и вы могли бы мне помочь. У меня есть автомобильный кластер, который разговаривает и слушает последовательную линию 0 В / + 12 В. Моя цель - отправить несколько дополнительных команд на комбинацию приборов. Я использую Serial2 от MEGA для этого и Serial для мониторинга всей сети.
Проблема в том, что мне нужно подождать, пока линия будет бездействовать / молчать, поэтому мое сообщение не прерывает другие линии, отправленные другими устройствами в сети.
У меня есть это до сих пор:
#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();
}
Я использую два оптоизолятора, чтобы получить правильные сигналы 0В/+12В.
смоделируйте эту схему - схема, созданная с помощью CircuitLab
Я использую оптосхему 4N35 и 2N3904 в качестве Q1.
Я заметил одну вещь, работая с этим. Arduino не отправляет начальные нули, например, 0x08 выходит как> 8, поэтому, возможно, принимающая сторона не распознает его?!
Я могу прочитать строку, используя эту схему и другой код, но я не проверял ее сторону «отправителя».
Думаю, это все, что у меня есть.
ОБНОВЛЕНИЕ № 1 = Исправлено отсутствие соединения между двумя оптическими датчиками и линией GND.
Я не уверен, как у вас подключен диод opto1 - я думаю, что его соединение с эмиттером opto2 должно быть заземлено.
Если вы проследите цепь через шину->R5->диод->транзистор->шину - это не может сделать ничего разумного - через эту цепь не может проходить ток, потому что нет третьего соединения с землей или питанием.
Возможно, вы нарисовали его неправильно, но в его нынешнем виде никто вряд ли поможет, если он не будет исправлен, потому что никто не может знать, чего вы пытаетесь достичь. Может я ошибаюсь?
Я считаю, что ваш код и схема отправляют правильную строку. Где ваш принимающий код удаляет начальные дополненные нули (как указано в комментарии Энди)
Как вы отправляете
D0 08 BF 5B 20 00 04 00 00 18
и вы заявляете, что получаете D08BF5B20040018, где, если вы расположите те же данные следующим образом, они кажутся правильными.
D0 8 BF 5B 20 0 4 0 0 18
Я вижу ваш код, используя:
Serial.println(Kdata,HEX);
и подумал бы, что это будет очевидно в выводе, перевод строки отмечает каждый полученный символ.
Обратите внимание, что полученный байт по-прежнему представляет собой целое число, независимо от того, что при выводе на печать отбрасывается начальный нуль. Чтобы увидеть оба полубайта, включая ведущие нули, вы можете использовать функцию printf.
#include <stdio.h>
...
sprintf(charVal, "%02X", Kdata);
Serial.println(charVal);
Я подобрал другие части системы k-bus (ibus), так что кажется, что я что-то упустил из-за внутренней подтяжки. Я использую тот же код (он был портирован на duemilanove), и теперь он работает как часы. Если кому-то нужна помощь с проектами, связанными с k-bus (ibus), свяжитесь со мной.
мпфлага
мпфлага
Зошко
Энди ака
Зошко