Serial - нестыковка теоретической и практической скорости приёма
- Войдите на сайт для отправки комментариев
Ср, 30/01/2019 - 15:38
Вот взял из интернета:
Скорость передачи,бод
Время передачи одного бита, мкс
Время передачи байта,мкс
4800
208
2083
Время передачи одного бита, мкс
Время передачи байта,мкс
4800
208
2083
9600
104
1042
104
1042
19200
52
521
52
521
38400
26
260
26
260
57600
17
174
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, что странно...
есть умные мысли?
Есть.
1) Вы находитесь в альтернативной реальности.
а по-подробней,без оскорблений, если способен?
а по-подробней,без оскорблений
где то ошибка в подсчетах.
ЗЫ. вопрос - а зачем вот это все сравнение, поиск истины?
где то ошибка в подсчетах.
ЗЫ. вопрос - а зачем вот это все сравнение, поиск истины?
а зачем форум?
для поиска истины...
если ошибка в подсчётах,то где?
я для этого и выложил полную информацию.
и если ожидаешь одно, а получаешь иное-это ли не повод задуматься?
а зачем форум?
для поиска истины...
а чтоб получить истину необходимо в данном случае конкретном случае написать "ручками" полную самостоятельную обработку отправляемых данных, т.е. знать как по UART отправляется каждый бит, аналогично сделать прием самостоятельно через прерывания. И вот когда вы отправите 10 байт за N время и вдруг примете эти же 10 байт за N+X время, вот тогда наверное придется искать чудо в другой вселенной.
Кратко: если измерять время прихода, опираясь на available() раз в 1мс - это одно и раз в 10сек - совершенно другое.
а зачем форум?
для поиска истины...
а чтоб получить истину необходимо в данном случае конкретном случае написать "ручками" полную самостоятельную обработку отправляемых данных, т.е. знать как по UART отправляется каждый бит, аналогично сделать прием самостоятельно через прерывания. И вот когда вы отправите 10 байт за N время и вдруг примете эти же 10 байт за N+X время, вот тогда наверное придется искать чудо в другой вселенной.
да ничего не надо писать...
упрощу вопрос для тех кто не хочет разбирать код:
есть данность-скорость передачи в бодах(бит в секунду).
это задаёт фиксированное время передачи одного бита.
для байта ,включая стоп биты, умножаем его на 10(8+2).
умножаем на колличество байт, которые надо получить.
это "чистое"(теоритическое) время для полученя всех байтов.
я же за время в 10 раз меньшее получаю их!
учитывая аппаратные задержки - реально в 3 раза!
почему?
пока-же только философия...
пока-же только философия...
не....я сдаюсь - sadman41 вам же написал почему,
почитайте уже про очередь UART, можете поднять исходники software serial - вдруг там найдете ответ, если выше ответы вы не поняли.
Кратко: если измерять время прихода, опираясь на available() раз в 1мс - это одно и раз в 10сек - совершенно другое.
данные приходят непрерывным потоком,например 40 байт.
если я зафиксировал с помощью available() меньшее колличество - это даёт возможность
просчитать относительное время начала передачи для синхронизации ответа.
получение всех 40 байт отсеивается как не имеющее точки отсчёта,что-бы не выйти за
рамки периода опроса для ответа из-за задержек в остальной части программы.
так что неважно -1мс или 10 сек...
а как раз понимание что происходит и влияет на току отсчёта:
надо брать теоретическую или есть ньюансы?...
поставлю по-другому вопрос:
можно-ли просчитать эту точку отсчёта и как,
и если да,то првильно ли я считаю?
и если можно без лазания в исходники и ехидных прищуров знатоков сути вселенной...
пока-же только философия...
не....я сдаюсь - sadman41 вам же написал почему,
почитайте уже про очередь UART, можете поднять исходники software serial - вдруг там найдете ответ, если выше ответы вы не поняли.
по-моему вы и сами не поняли...по-этому и сдаётесь.
и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...
и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...
Один дурак может задать столько дурных вопросов, что не ответят и сто мудрецов. (с)
никого не имею в виду конкретно, просто цитата из сети :)
по-моему вы и сами не поняли...по-этому и сдаётесь.
и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...
хм...пусть будет так.
и вообще объяснять сложные вещи понятно простыми словами-это талант,который не каждому дан...
Один дурак может задать столько дурных вопросов, что не ответят и сто мудрецов. (с)
никого не имею в виду конкретно, просто цитата из сети :)
ха-ха,посмеялись по делу...
есть желание лясы поточить?
есть желание лясы поточить?
ни малейшего.
Вы пытаетесь измерять толщину волоса школьной линейкой - и удивляетесь. что результат не совпадает со справочником.
вам уже сказали - проведите измерения, которым можно доверять - тогда будет что обсудить. А пока только лясы точить.
Хорошо, более наглядный пример: Вы замеряете скорость бега на стометровке у школотронов.
Дали старт, жахнули триста грамм, очнулись - на секундомере три круга (нереально, но представим, что так), школотроны все на финише. Получается что - они все пешком шли?
Дали старт, жахнули триста грамм, очнулись - на секундомере три круга (нереально, но представим, что так), школотроны все на финише. Получается что - они все пешком шли?
Надо еще обязательно об этом случае статью в журнал "Народное образование" жахнуть под каким-нибудь душераздирающим заголовком...
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)