UNO не принимает передачу по Serial
- Войдите на сайт для отправки комментариев
Всем привет! Делаю приборку в машину, дисплей пока в пути, решил написать блока передачи. Конструктивно есть блок на Nano к которому подведены все 12 вольтовые провода через резистивные делители и выходят провода управления через КТ815/816. Сам по себе он работает. И блок на UNO на который ставит дисплейная шилда и там останется свободными 2 аналоговых и 2 цифровых выхода. Соответственно он будет получать данные по Serial и в себе уже переваривать, чтоб отобразить на дисплее.
Вот кусок кода для отправки (на Nano), всё просто и в мониторе порта постоянно получается строка, как и планировалось
void Priborka (){ Serial.print(CurrentSpeed); Serial.print("S"); Serial.print(MemSpeed); Serial.print("C"); Serial.print(rpm); Serial.print("R"); Serial.print(ActiveCruise); Serial.print("A"); Serial.print(CurrentGear); Serial.print("G"); Serial.println(""); }
Скорость порта указана 9600
Вот код на UNO, за неимением TFT дисплея вывожу пока на сегментный один из параметров
String inString = ""; // символы ставятся после значения int CurrentSpeed = 0; //символ S int CruiseSpeed = 0; //символ С int rpm = 0; //символ R int ActiveCruise; //символ A int gear; //символ G // Сегментный дисплей #include <TM74HC595Display.h> int SCLK = 12; int RCLK = 11; int DIO = 10; TM74HC595Display disp(SCLK, RCLK, DIO); unsigned char LED_0F[29]; int interval = 1000; void setup() { Serial.begin(9600); } void loop() { digitaldisplay(); receive(); // answer(); } void digitaldisplay(){ disp.digit4(rpm, 1); } void receive() { while (Serial.available() > 0) { int inChar = Serial.read(); if (isDigit(inChar)) { inString += (char)inChar; } if (inChar == 'S') { CurrentSpeed = inString.toInt(); inString = ""; } if (inChar == 'C') { CruiseSpeed = inString.toInt(); inString = ""; } if (inChar == 'R') { rpm = inString.toInt(); inString = ""; } if (inChar == 'A') { ActiveCruise = inString.toInt(); inString = ""; } if (inChar == 'G') { gear = inString.toInt(); inString = ""; } } } void answer() { Serial.print("CurrentSpeed "); Serial.println(CurrentSpeed); Serial.print("inString "); Serial.println(inString); Serial.print("CruiseSpeed "); Serial.println(CruiseSpeed); Serial.print("RPM "); Serial.println(rpm); Serial.println(""); }
И если отправлять с монитора порта строку вида "значениеSзначениеCзначениеRзначениеAзначениеG", всё работает и дисплей показывает значение нормально. Но когда соединяю обе платы проводами - на UNO даже не мигает светодиод приёма. Соединяю естественно накрест Rx к Tx и наоборот. Питание общее земля тоже.
Я что-то недописал в части передатчика, что UNO не понимает, что началась передача?
Так. Короче если соеденить Rx с Tx у UNO и попытаться чё-то передавать, то светодиод Rx тоже не горит. Не работает порт? При заливке через USB всё пашет, светодиод моргает данные идут. Я думал если сгорает порт на микросхеме, то через USB уж тем более ничего работать не будет.
Мда, оказалось китайцы психанули с резистором в этой цепи, заменил на поменьше и всё завелось.
вы планируете две ардуины установить в авто и связать через Serial? Не очень удачная идея. В автомобильной сети жуткие помехи. UART (так правильно называется то что работает при использовании Serial) на это не расчитан. Вам надо смотроеть в сторону RS232 или RS485. Это с точки зрения программы тот же Serial, но с точки зрения железа ставятся чипы с двух сторон которые обеспечивают более устойчивую к помехам передачу сигнала. Есть готовые шилды с этими чипами
Да, уже думал о помехозащите. В принципе у нано я заколхозил источник питания на MC34063, у него масимальный ток под ампер, так что все остальные платы я буду питать через него же, а не от бортсети напрямую, так что это должно существенно уменьшить помехи. Но в любом случае посмотрю на предлагаемые варианты с 232 и 485.
Интересная тема. А какие задачи у UNO вообще? Выводить данные на дисплей и всё? Управления никакого не предусмотрено?
Пока никаких. Ну кнопка сброса суточного пробега ещё на ней висеть будет. В принципе экран сенсорный, так что можно заколхозить что угодно.
Так, а подскажите, если надо, чтоб параметр обозначался не одной буквой, а фразой, то как это сделать? Каскад из "if" когда делает несколько условий подряд из которых собирается фраза почему-то не работает.