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" когда делает несколько условий подряд из которых собирается фраза почему-то не работает.