Serial - нестыковка теоретической и практической скорости приёма

valiktom
Offline
Зарегистрирован: 19.12.2016

Вот взял из интернета:

Скорость передачи,бод
  Время передачи одного бита, мкс
  Время передачи байта,мкс
  4800
  208
  2083
 
  9600
  104
  1042
 
  19200
  52
  521
 
  38400
  26
  260
 
  57600
  17
  174
 
А вот часть моего скетча для приёма данных по сериалу:
unsigned long ComBod[] = {57600, 38400, 19200, 9600, 4800};
SoftwareSerial Serialcom(3, 2);
byte Fragment = 0;

 //…………………………………………..

void loop() {
 //………………………………..
      unsigned long mcstime = micros();
      byte numbyte = Fragment + Serialcom.available();//вначале пришли байты
      float bytesendtime = 1000000.0 / (float)ComBod[combod] * (float)remain;//ожидаемое, необходимое для "Delay" время передачи одного байта
      if (!Fragment) {//если это не дополнение приёма байтов
        byte backbyte = numbyte % 16;
        if (backbyte) {//если пришли не все байты(=16),то время начала передачи первого байта для синхронизации ответа:
          ComTime = mcstime - (unsigned int)(bytesendtime * (float)backbyte * 10.0 / (float)remain);//теоретическое значение
        }
      }
      byte Numbyte = 0;
      do {
        char c = Serialcom.read();
        InCom += c;
        Numbyte++;
      } while (Serialcom.available());//пока читаем, возможно приходят ещё байты
      byte Plusbyte = Numbyte % 16;
      unsigned int Delay = 0;
      if (Plusbyte) {//если всё равно пришли не все байты,то ждём время необходимое для приёма остальных:
        Delay = (unsigned int)(bytesendtime * (float)(16 - Plusbyte));
        delayMicroseconds(Delay);
        Plusbyte = 0;
        do {
          char c = Serialcom.read();
          InCom += c;
          Plusbyte++;
        } while (Serialcom.available());//пока читаем, возможно приходят ещё байты
      }//если в сумме "Delay" не достаточный,то получим "Fragment" и компенсируем "bytesendtime" с помощью "remain++" на следующем приёме
      if (Test) {
        Serial.println(InCom);
        Serial.print(F("Received "));
        Serial.print(numbyte);
        Serial.print('/');
        Serial.print(Numbyte);
        Serial.print('+');
        Serial.println(Plusbyte);
        Serial.print(F("Remain x"));
        Serial.println(remain);
        Serial.print(F("Delay "));
        Serial.println(Delay);
      }
 //……………………………….
}

Так вот:

листинг всреднем даёт 

numbyte = 3

Numbyte = 10

т.е за время чтения мы успеваем получить в два раза больше байт.

и если мы должны получить 40 байт(не 16 как в скетче) в конечном счёте,

то при remain=1(что и есть при загрузке для минимизации задержки)

мы ссужаем для остальных 30 байт время теоретически по таблице достаточное только для трёх байт.

и если мы за время чтения после задержки теоретически добрали ещё 10 байт так-же,

то откуда берутся остальные 20 байт,которые я в реальности получаю?

в реальности всё прекрасно работает и при remain=1, что странно...

есть умные мысли?

sadman41
Offline
Зарегистрирован: 19.10.2016

Есть.

1) Вы находитесь в альтернативной реальности.

valiktom
Offline
Зарегистрирован: 19.12.2016

а по-подробней,без оскорблений, если способен?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

valiktom пишет:

а по-подробней,без оскорблений

где то ошибка в подсчетах.

ЗЫ. вопрос - а зачем вот это все сравнение, поиск истины?

 

valiktom
Offline
Зарегистрирован: 19.12.2016

andycat пишет:

где то ошибка в подсчетах.

ЗЫ. вопрос - а зачем вот это все сравнение, поиск истины?

а зачем форум?

для поиска истины...

если ошибка в подсчётах,то где?

я для этого и выложил полную  информацию.

и если ожидаешь одно, а получаешь иное-это ли не повод задуматься?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

valiktom пишет:

а зачем форум?

для поиска истины...

а чтоб получить истину необходимо в данном случае конкретном случае написать "ручками" полную самостоятельную обработку отправляемых данных, т.е. знать как по UART отправляется каждый бит, аналогично сделать прием самостоятельно через прерывания. И вот когда вы отправите 10 байт за N время и вдруг примете эти же 10 байт за N+X время, вот тогда наверное придется искать чудо в другой вселенной.

sadman41
Offline
Зарегистрирован: 19.10.2016

Кратко: если измерять время прихода, опираясь на available() раз в 1мс - это одно и раз в 10сек - совершенно другое.

valiktom
Offline
Зарегистрирован: 19.12.2016

andycat пишет:

valiktom пишет:

а зачем форум?

для поиска истины...

а чтоб получить истину необходимо в данном случае конкретном случае написать "ручками" полную самостоятельную обработку отправляемых данных, т.е. знать как по UART отправляется каждый бит, аналогично сделать прием самостоятельно через прерывания. И вот когда вы отправите 10 байт за N время и вдруг примете эти же 10 байт за N+X время, вот тогда наверное придется искать чудо в другой вселенной.

да ничего не надо писать...

упрощу вопрос для тех кто не хочет разбирать код:

есть данность-скорость передачи в бодах(бит в секунду).

это задаёт фиксированное время передачи одного бита.

для байта ,включая стоп биты, умножаем его на 10(8+2).

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

это "чистое"(теоритическое) время для полученя всех байтов.

я же за время в 10 раз меньшее получаю их!

учитывая аппаратные задержки - реально в 3 раза!

почему?

пока-же только философия...

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

valiktom пишет:

пока-же только философия...

не....я сдаюсь - sadman41 вам же написал почему,

почитайте уже про очередь UART, можете поднять исходники software serial - вдруг там найдете ответ, если выше ответы вы не поняли.

valiktom
Offline
Зарегистрирован: 19.12.2016

sadman41 пишет:

Кратко: если измерять время прихода, опираясь на available() раз в 1мс - это одно и раз в 10сек - совершенно другое.

данные приходят непрерывным потоком,например 40 байт.

если я зафиксировал с помощью available() меньшее колличество - это даёт возможность

просчитать относительное время начала передачи для синхронизации ответа.

получение всех 40 байт отсеивается как не имеющее точки отсчёта,что-бы не выйти за

рамки периода опроса для ответа из-за задержек в остальной части программы.

так что неважно -1мс или 10 сек...

а как раз понимание что происходит и влияет на току отсчёта:

надо брать теоретическую или есть ньюансы?...

поставлю по-другому вопрос:

можно-ли просчитать эту точку отсчёта и как,

и если да,то првильно ли я считаю?

и если можно без лазания в исходники и ехидных прищуров знатоков сути вселенной...

valiktom
Offline
Зарегистрирован: 19.12.2016

andycat пишет:

valiktom пишет:

пока-же только философия...

не....я сдаюсь - sadman41 вам же написал почему,

почитайте уже про очередь UART, можете поднять исходники software serial - вдруг там найдете ответ, если выше ответы вы не поняли.

по-моему вы и сами не поняли...по-этому и сдаётесь.

и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...

b707
Offline
Зарегистрирован: 26.05.2017

valiktom пишет:

и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...

Один дурак может задать столько дурных вопросов, что не ответят и сто мудрецов. (с)

никого не имею в виду конкретно, просто цитата из сети :)

 

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

valiktom пишет:

по-моему вы и сами не поняли...по-этому и сдаётесь.

и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...

хм...пусть будет так.

valiktom
Offline
Зарегистрирован: 19.12.2016

b707 пишет:

valiktom пишет:

и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...

Один дурак может задать столько дурных вопросов, что не ответят и сто мудрецов. (с)

никого не имею в виду конкретно, просто цитата из сети :)

 

ха-ха,посмеялись по делу...

есть желание лясы поточить?

b707
Offline
Зарегистрирован: 26.05.2017

valiktom пишет:

есть желание лясы поточить?

ни малейшего.

Вы пытаетесь измерять толщину волоса школьной линейкой - и удивляетесь. что результат не совпадает со справочником.

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Хорошо, более наглядный пример: Вы замеряете скорость бега на стометровке у школотронов.

Дали старт, жахнули триста грамм, очнулись - на секундомере три круга (нереально, но представим, что так), школотроны все на финише. Получается что - они все пешком шли?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Дали старт, жахнули триста грамм, очнулись - на секундомере три круга (нереально, но представим, что так), школотроны все на финише. Получается что - они все пешком шли?

Надо еще обязательно об этом случае статью в журнал "Народное образование" жахнуть под каким-нибудь душераздирающим заголовком...

strarbit
Offline
Зарегистрирован: 12.06.2016

Serial.available()
Description
Get the number of bytes (characters) available for reading from the serial port.
This is data that’s already arrived and stored in the serial receive buffer (which holds 64 bytes).
available() inherits from the Stream utility class.

1 bit microsec = (1 / baut rate)