что происходит с входящим буфером RX при переполнении?

vde69
Offline
Зарегистрирован: 10.01.2016

какие данные теряются? самые старые или новые?

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

vde69 пишет:

какие данные теряются? самые старые или новые?

проверь, отправив строку "10000....00001" равную длине буфера + 1 символ.

Logik
Offline
Зарегистрирован: 05.08.2014

Ставлю пятерик на то, что теряются старые.

vde69
Offline
Зарегистрирован: 10.01.2016

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

по логике терятся должны старые данные, но исходя из описания вроде-бы теряются новые.... то есть в описании написано, что peek() всегда возвращает одно и то-же пока не будет прочитан или очищен буфер...

 

а вообще - очень прикольно с переполнением разбиратся, реально мозг раскорячился от "симптомов"...

ps

ну вот и начались сетевые грабли, ура !!!! а еще мне что-то пришло на почту, наверно тач панели....

теперь нужен третий модуль в моей сети, два работаю как надо, надо тестить дальше на бОльших трафиках...

__Alexander
Offline
Зарегистрирован: 24.10.2012

а файлики serial пооткрывать и посмотреть нельзя?

vde69
Offline
Зарегистрирован: 10.01.2016

__Alexander пишет:

а файлики serial пооткрывать и посмотреть нельзя?

ну во первых класс лежит в файле HardwareSerial, а во вторых я там ногу сломал... хотя и дописывал его чуток

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

__Alexander пишет:

а файлики serial пооткрывать и посмотреть нельзя?

Не наш метод!

__Alexander
Offline
Зарегистрирован: 24.10.2012

vde69 пишет:

класс лежит в файле HardwareSerial, а во вторых я там ногу сломал... хотя и дописывал его чуток

ну ладно. вот прерывание по приему байта. сложно?

void HardwareSerial::_rx_complete_irq(void)
{
  if (bit_is_clear(*_ucsra, UPE0)) {
    // No Parity error, read byte and store it in the buffer if there is
    // room
    unsigned char c = *_udr;
    rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;

    // if we should be storing the received character into the location
    // just before the tail (meaning that the head would advance to the
    // current location of the tail), we're about to overflow the buffer
    // and so we don't write the character or advance the head.
    if (i != _rx_buffer_tail) {
      _rx_buffer[_rx_buffer_head] = c;
      _rx_buffer_head = i;
    }
  } else {
    // Parity error, read byte but discard it
    *_udr;
  };
}  

 

vde69
Offline
Зарегистрирован: 10.01.2016

проглядел видать... но ведь я прав оказался, теряются новые :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Какое нахер новые? Словосочетание "кольцевой буфер" вам о чём нибудь говорит? Затираются старые данные в кольцевом буфере, внимательно смотрите код.

vde69
Offline
Зарегистрирован: 10.01.2016

DIYMan пишет:

Какое нахер новые? Словосочетание "кольцевой буфер" вам о чём нибудь говорит? Затираются старые данные в кольцевом буфере, внимательно смотрите код.

а условие смотрел? там хвост растет только до головы, как до головы дошел - дальше все входящие данные теряются....

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vde69 пишет:

а условие смотрел? там хвост растет только до головы, как до головы дошел - дальше все входящие данные теряются....

Да, чего-то проглядел, старею, млять. Грешным делом думал что там честный кольцевой буфер, ан нет. Сам себе поставил минус :)