Двусторонний обмен по Serial порту
- Войдите на сайт для отправки комментариев
Втр, 27/09/2016 - 14:38
Две платы, Arduino Mega и ESP8266, соединены по Serial.
Если передача данных идет от одной платы (любой) к другой, только в одну сторону, данные передаются нормально. Как только передача данных начинает идти в обе стороны, данные в буфере теряются, либо искажаются.
Подскажите, почему так происходит и какой механизм надо использовать, чтобы передавать данные в обе стороны.
Скорость? Какой Сериал - программный или аппаратный?
Скорость 9600, на Меге Serial3 аппаратный, на ESP Serial аппаратный. У меня похоже проблема, когда одна сторона начала читать передаваемые сообщения, и одновременно передает что-то другой стороне. Или одновременно с обеих сторон передавать данные по Serial нельзя?
Не знаю, боюсь, что не смогу помочь. У меня таких проблем не было, всё нормально передавалось. Думал, что у Вас скорость слишком большая, но нет. Так что, извините - не знаю.
Кажется понял источник проблемы.
Я передаю по UART количество данных (строками, завершающимися символами '\r\n'), большее чем буфер передачи UART (он 64 байта). На отправляющей стороне я записываю в буфер, только когда он свободен, вот такой конструкцией:
Т.е. не даю перезаписываться циклическому TX-буферу отправки, пока данные не отправлены.
А вот на принимающей стороне я читаю из буфера построчно, пока есть данные, НО после считывания каждой строки из RX-буфера вызываю свою функцию, которая выполняется в среднем 200 миллисекунд. И получается, что какие-то данные я теряю.
Вопрос:
1. Действительно ли за 200 миллисекунд приемный циклический буфер может перезаписываться новыми данными?
2. Как поступить в данном случае, чтобы не терять данные?
Увеличить буфер - не вариант?
Увеличить буфер - не вариант?
А как увеличить буфер для платы ESP? Увеличение в стандартном HardwareSerial не помогает (при компиляции такое же значение свободной памяти, что и до увеличения.
Так буфер там один для всего. Его и надо увеличивать. Если такое же значение, значит что-то не так увеличили.
Так буфер там один для всего.
Ну как один? Ведь скетчи компилируются и заливаются и в Ардуино и в ESP8266. И у каждого модуля свой RX и TX буфера, которые взаимодействуют с аппаратными UART обоих устройств.
Или я не совсем понимаю организацию передачи по UART?
Нет, понятно, что в каждом устройстве свой. Я понял Вас, что Вы имеете в виду какой-то особоый буфер в ардуине именно для ESP
какой-то особоый буфер в ардуине именно для ESP
Да, и это явно не тот буфер, что определен в HardwareSerial.h
Вот тут нарыл статейку интересную, где расписана физика передачи данных по UART
http://microsin.net/programming/avr/atmega2560-working-with-uart.html
Скорость 9600...
...буфер передачи UART (он 64 байта).
Вопрос:
1. Действительно ли за 200 миллисекунд приемный циклический буфер может перезаписываться новыми данными?
Элементарно, Ватсон! Сколько времени понадобится, чтобы заполнить буфер размером 64 байта при скорости передачи 9600?