Последовательная COM-сеть + Arduino

Я новичок на этом сайте, но у меня возникла проблема, и вы могли бы мне помочь. У меня есть автомобильный кластер, который разговаривает и слушает последовательную линию 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.

Вы проверили скорость опто. как взлет, так и падение.
Является ли протокол шины вашего кластера UART 8E1 9600. Обратите внимание, что 8 Even маловероятно там, где 8N1, 7E1 или 7O1. Я не следую утверждению «0x08 выходит как> 8 с»
Я имел в виду, что пытаюсь отправить это: D0 08 BF 5B 20 00 04 00 00 18 Arduino превращает это в это: D08BF5B20040018 «Физический уровень шины представляет собой установку с открытым коллектором, на которую шина натягивает высокий уровень (+12 В) и низкий уровень. говорящим. Это означает, что нормальное напряжение на проводе составляет +12 В (напряжение батареи, или Vbatt). Бит передается при понижении напряжения или кратковременном замыкании шины на землю. Это противоположно многим цифровым сигналам, где нормальное напряжение равно 0 В и имеет высокий уровень для отправки бита. Последовательная связь по шине: 9600 бит/с, 8 битов данных, проверка на четность, 1 стоповый бит».
За исключением самого начала (D0 08 становится D0 8B) все остальные искажения являются потерями "00". Это подсказка? Не обращайте на меня внимания, если я тупой.
Это похоже на то, что D0 - это идентификатор отправителя, 08 - это длина BF, это цель, а затем фактические команды 5B для состояния лампы и байты управления. 18 в конце - контрольная сумма. D0 08 BF 5B 20 00 04 00 00 18 Означает следующее: От LCM (Модуль управления освещением) к общему: Состояние лампы: Индикатор_Левый Индикатор_синхронизация Все_ок Так что, если Arduino решит, что нам не нужны эти 0, это будет полная неразбериха. Как если бы мы не дождались разрешения на связь.

Ответы (3)

Я не уверен, как у вас подключен диод opto1 - я думаю, что его соединение с эмиттером opto2 должно быть заземлено.

Если вы проследите цепь через шину->R5->диод->транзистор->шину - это не может сделать ничего разумного - через эту цепь не может проходить ток, потому что нет третьего соединения с землей или питанием.

Возможно, вы нарисовали его неправильно, но в его нынешнем виде никто вряд ли поможет, если он не будет исправлен, потому что никто не может знать, чего вы пытаетесь достичь. Может я ошибаюсь?

введите описание изображения здесь

вероятно, эмиттер opto2 и катод opto1 должны быть подключены к земле.
@mpflaga это то, что я сказал, чувак, но спасибо за подтверждение.
Да, я сделал это неправильно! :D Это заземлено. Скорость 4N35 tr= 7мкс, tf= 7мкс по даташиту это "Высокоскоростное переключение"

Я считаю, что ваш код и схема отправляют правильную строку. Где ваш принимающий код удаляет начальные дополненные нули (как указано в комментарии Энди)

Как вы отправляете

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), свяжитесь со мной.введите описание изображения здесь