Двусторонний обмен по Serial порту

max506
Offline
Зарегистрирован: 04.08.2016

Две платы, Arduino Mega и ESP8266, соединены по Serial.

Если передача данных идет от одной платы (любой) к другой, только в одну сторону, данные передаются нормально. Как только передача данных начинает идти в обе стороны, данные в буфере теряются, либо искажаются.

Подскажите, почему так происходит и какой механизм надо использовать, чтобы передавать данные в обе стороны.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скорость? Какой Сериал - программный или аппаратный?

max506
Offline
Зарегистрирован: 04.08.2016

Скорость 9600, на Меге Serial3 аппаратный, на ESP Serial аппаратный. У меня похоже проблема, когда одна сторона начала читать передаваемые сообщения, и одновременно передает что-то другой стороне. Или одновременно с обеих сторон передавать данные по Serial нельзя?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, боюсь, что не смогу помочь. У меня таких проблем не было, всё нормально передавалось. Думал, что у Вас скорость слишком большая, но нет. Так что, извините - не знаю.

max506
Offline
Зарегистрирован: 04.08.2016

Кажется понял источник проблемы.

Я передаю по UART количество данных (строками, завершающимися символами '\r\n'), большее чем буфер передачи UART (он 64 байта). На отправляющей стороне я записываю в буфер, только когда он свободен, вот такой конструкцией:

while (Serial3.availableForWrite()<63)
    i++;
  Serial3.println(buf);

Т.е. не даю перезаписываться циклическому TX-буферу отправки, пока данные не отправлены.

А вот на принимающей стороне я читаю из буфера построчно, пока есть данные, НО после считывания каждой строки из RX-буфера вызываю свою функцию, которая выполняется в среднем 200 миллисекунд. И получается, что какие-то данные я теряю.

Вопрос:

1. Действительно ли за 200 миллисекунд приемный циклический буфер может перезаписываться новыми данными?

2. Как поступить в данном случае, чтобы не терять данные?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Увеличить буфер - не вариант?

max506
Offline
Зарегистрирован: 04.08.2016

ЕвгенийП пишет:

Увеличить буфер - не вариант?

А как увеличить буфер для платы ESP? Увеличение в стандартном HardwareSerial не помогает (при компиляции такое же значение свободной памяти, что и до увеличения.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так буфер там один для всего. Его и надо увеличивать. Если такое же значение, значит что-то не так увеличили.

max506
Offline
Зарегистрирован: 04.08.2016

ЕвгенийП пишет:

Так буфер там один для всего.

Ну как один? Ведь скетчи компилируются и заливаются и в Ардуино и в ESP8266. И у каждого модуля свой RX и TX буфера, которые взаимодействуют с аппаратными UART обоих устройств.

Или я не совсем понимаю организацию передачи по UART?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, понятно, что в каждом устройстве свой. Я понял Вас, что Вы имеете в виду какой-то особоый буфер в ардуине именно для ESP

max506
Offline
Зарегистрирован: 04.08.2016

ЕвгенийП пишет:

какой-то особоый буфер в ардуине именно для ESP

Да, и это явно не тот буфер, что определен в HardwareSerial.h

Вот тут нарыл статейку интересную, где расписана физика передачи данных по UART

http://microsin.net/programming/avr/atmega2560-working-with-uart.html

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

max506 пишет:

Скорость 9600...

max506 пишет:

...буфер передачи UART (он 64 байта).

Вопрос:

1. Действительно ли за 200 миллисекунд приемный циклический буфер может перезаписываться новыми данными?

Элементарно, Ватсон! Сколько времени понадобится, чтобы заполнить буфер размером 64 байта при скорости передачи 9600?