UNO не принимает передачу по Serial

Sync
Offline
Зарегистрирован: 12.01.2016

Всем привет! Делаю приборку в машину, дисплей пока в пути, решил написать блока передачи. Конструктивно есть блок на 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 не понимает, что началась передача?

Sync
Offline
Зарегистрирован: 12.01.2016

Так. Короче если соеденить Rx с Tx у UNO и попытаться чё-то передавать, то светодиод Rx тоже не горит. Не работает порт? При заливке через USB всё пашет, светодиод моргает данные идут. Я думал если сгорает порт на микросхеме, то через USB уж тем более ничего работать не будет.

Sync
Offline
Зарегистрирован: 12.01.2016

Мда, оказалось китайцы психанули с резистором в этой цепи, заменил на поменьше и всё завелось.

axill
Offline
Зарегистрирован: 05.09.2011

вы планируете две ардуины установить в авто и связать через Serial? Не очень удачная идея. В автомобильной сети жуткие помехи. UART (так правильно называется то что работает при использовании Serial) на это не расчитан. Вам надо смотроеть в сторону RS232 или RS485. Это с точки зрения программы тот же Serial, но с точки зрения железа ставятся чипы с двух сторон которые обеспечивают более устойчивую к помехам передачу сигнала. Есть готовые шилды с этими чипами

Sync
Offline
Зарегистрирован: 12.01.2016

Да, уже думал о помехозащите. В принципе у нано я заколхозил источник питания на MC34063, у него масимальный ток под ампер, так что все остальные платы я буду питать через него же, а не от бортсети напрямую, так что это должно существенно уменьшить помехи. Но в любом случае посмотрю на предлагаемые варианты с 232 и 485.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Интересная тема. А какие задачи у UNO вообще? Выводить данные на дисплей и всё? Управления никакого не предусмотрено?

Sync
Offline
Зарегистрирован: 12.01.2016

Пока никаких. Ну кнопка сброса суточного пробега ещё на ней висеть будет. В принципе экран сенсорный, так что можно заколхозить что угодно.

Sync
Offline
Зарегистрирован: 12.01.2016

Так, а подскажите, если надо, чтоб параметр обозначался не одной буквой, а фразой, то как это сделать? Каскад из "if" когда делает несколько условий подряд из которых собирается фраза почему-то не работает.