Проблема в USB to RS-232 FTDI адаптере.
Заменил FTDI на Prolific PL2303HX — все работает корректно, хотя это FTDI устройство в Windows работает надежно.
Здравствуйте, indee, Вы писали:
I>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>Кабель серийного порта подключен к компьютеру где считываю данные.
... I>Параметры серийного порта: 9600, 8, evenparity, onestopbit
I>В чем может быть ошибка?
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, indee, Вы писали:
I>>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>>Кабель серийного порта подключен к компьютеру где считываю данные. _>... I>>Параметры серийного порта: 9600, 8, evenparity, onestopbit
I>>В чем может быть ошибка?
_>Дребизг (плохой контакт). Или паразитная ёмкость. _>
Здравствуйте, indee, Вы писали:
I>Здравствуйте, kov_serg, Вы писали:
_>>Здравствуйте, indee, Вы писали:
I>>>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>>>Кабель серийного порта подключен к компьютеру где считываю данные. _>>... I>>>Параметры серийного порта: 9600, 8, evenparity, onestopbit
I>>>В чем может быть ошибка?
_>>Дребизг (плохой контакт). Или паразитная ёмкость. _>>
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, indee, Вы писали:
I>>Здравствуйте, kov_serg, Вы писали:
_>>>Здравствуйте, indee, Вы писали:
I>>>>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>>>>Кабель серийного порта подключен к компьютеру где считываю данные. _>>>... I>>>>Параметры серийного порта: 9600, 8, evenparity, onestopbit
I>>>>В чем может быть ошибка?
_>>>Дребизг (плохой контакт). Или паразитная ёмкость. _>>>
I>>Вряд ли, паразитный набор символов для строки "0123456789\r" всегда постоянен.
_>Тогда отправляй другой набор данных для опытов
_>0x00, 0xFF, 0xF0, 0x0F, 0x33, 0xCC, 0x55, 0xAA, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
При другом наборе данных, другой постоянный и неправильный набор данных.
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, indee, Вы писали:
I>>В чем может быть ошибка? K>Похоже на проблему в памятью. Какой-нибудь буфер не разваливается при чтении/записи?
Как это проверить?
Пробовал Valgrind, все чисто.
Проверял чтение снифером, вроде, кленту данные приходят уже битые, похоже, дисторшен на записи.
Здравствуйте, indee, Вы писали:
I>Как это проверить? I>Пробовал Valgrind, все чисто. I>Проверял чтение снифером, вроде, кленту данные приходят уже битые, похоже, дисторшен на записи.
Или уходят битыми, например. Если это таки проблема железа, то советы выше дали, но ИМХО, на железо грешить последнее дело.
Здравствуйте, indee, Вы писали:
_>>Тогда отправляй другой набор данных для опытов
_>>0x00, 0xFF, 0xF0, 0x0F, 0x33, 0xCC, 0x55, 0xAA, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
I>При другом наборе данных, другой постоянный и неправильный набор данных.
Вы меня не поняли. Я имею ввдиду что на таком наборе данных проще смотреть дребизг.
Данные в ком порте идут последовательно [ 0 (Стратовый бит), Бит0, Бит1, Бит2 ... Бит7, Четность, 1 (стоп бит) ] [...] при этом штатно 0=+12в, 1=-12в
И комбинации 1111 [010101010P1] [010101010P1] [010101010P1] [010101010P1] [010101010P1] 1111 Сответстует строка 0x55,0x55,0x55,0x55,0x55.
Вызывает самую высокую частоту можно даже послушать динамиком.
Далее стартовая последовательнось обычно должна быть максимально энергоёмкой, так что 0x00 0xFF самое оно.
Еще вопрос как часто приходят неправильные данные?
Здравствуйте, kov_serg, Вы писали:
_>Далее стартовая последовательнось обычно должна быть максимально энергоёмкой, так что 0x00 0xFF самое оно.
Хм, откуда такое правило?
_>Еще вопрос как часто приходят неправильные данные?
_>убери flush _> // tcflush(Port, TCIOFLUSH); -- поробуй без этого
Это сделает только хуже.
_>Поменяй кабель на более короткий
Ещё можно повысить/понизить скорость и сравнить частоту, если с ростом скорости растёт частота ошибки, то это, скорее всего, ошибка аналогового уровня.
Здравствуйте, Kernan, Вы писали:
K>Или уходят битыми, например. Если это таки проблема железа, то советы выше дали, но ИМХО, на железо грешить последнее дело.
Ну да — с какой там ревизии 16550A сделали действительно безглючный fifo?
Здравствуйте, indee, Вы писали:
I>Но иногда вместо ожидаемого набора символов получаю такую последовательность:
А иногда, это когда? С определённым периодом или случайно?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, kov_serg, Вы писали:
_>>Далее стартовая последовательнось обычно должна быть максимально энергоёмкой, так что 0x00 0xFF самое оно.
N>Хм, откуда такое правило?
_>>Еще вопрос как часто приходят неправильные данные?
_>>убери flush _>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого
N>Это сделает только хуже.
_>>Поменяй кабель на более короткий
N>Ещё можно повысить/понизить скорость и сравнить частоту, если с ростом скорости растёт частота ошибки, то это, скорее всего, ошибка аналогового уровня.
Кстати, понижение скорости это реальная тема? например до 2400.
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, indee, Вы писали:
I>>Но иногда вместо ожидаемого набора символов получаю такую последовательность: V>А иногда, это когда? С определённым периодом или случайно?
Здравствуйте, indee, Вы писали:
I>>>Но иногда вместо ожидаемого набора символов получаю такую последовательность: V>>А иногда, это когда? С определённым периодом или случайно? I>Случайно, примерно, 1 к 1000.
Это относительно того набора, что в примере или, к примеру, здесь 1 это 1МБ данных, ну т.е. каждые 1ГБ?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, kov_serg, Вы писали:
_>>Далее стартовая последовательнось обычно должна быть максимально энергоёмкой, так что 0x00 0xFF самое оно.
N>Хм, откуда такое правило?
Элементарно. Если вы хотите привлечь внимание надо громко рявкнуть потом можно говорить.
_>>Еще вопрос как часто приходят неправильные данные?
_>>убери flush _>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого
N>Это сделает только хуже.
Не надо предположений. Просто попробуй.
_>>Поменяй кабель на более короткий
N>Ещё можно повысить/понизить скорость и сравнить частоту, если с ростом скорости растёт частота ошибки, то это, скорее всего, ошибка аналогового уровня.
Это правильно. Т.к. если у вас например силовая электроника или авто где рядом система зажигания, то интерфиренция сигналов, помехи
вполне нормальное явление. Поэтому используют контрольные суммы и короткие кадры.
Хотя у вас I>>>Но иногда вместо ожидаемого набора символов получаю такую последовательность: V>>А иногда, это когда? С определённым периодом или случайно?
I>Случайно, примерно, 1 к 1000.
Очень высокая вероятность. Постоянный неправильный кадр. Скорее всего это прогамный косяк.
Причем очень советую проверить не только передатчик. Но код приёмника.
Т.к. у вас передача с битом четности и не возникает ошибок. То полюбому где-то ляп.
Это не у меня, я никак не связан с автором темы.
_>>>убери flush _>>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого N>>Это сделает только хуже. _>Не надо предположений. Просто попробуй.
Мне не на чем пробовать, но я таки прошу обоснований к этому пункту.
По остальному — нет возражений (кроме неоднозначной "энергоёмкости" посылок).
Здравствуйте, indee, Вы писали:
I>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>Кабель серийного порта подключен к компьютеру где считываю данные.
I>Параметры серийного порта: 9600, 8, evenparity, onestopbit
Подкину еще версии:
1) Неточно согласованные скорости — частота порта (baudrate) формируется делением исходной частоты на целый коэффициент, что приводит к погрешностям. Актуально для МК со встроенным UART контроллером. К RPi скорее всего неприменимо, и искажения пакетов были бы практически постоянно.
2) В RPi/Raspbian последовательный порт /dev/ttyAMA0 изначально используется системой (консолью), надо отключать использование порта. Возможно, что и в другие порты может какой-то процесс вклиниваться.
3) Копать в сторону железа — как выполнено подключение к компьютеру? Кабель USB-UART на CP1202/FTDI со стороны ПК к UART линиям порта RPi? Или USB-RS232 адаптеры с обеих сторон? (/dev/ttyUSB0 намекает на этот вариант). В идеале посмотреть сигналы на линии логическим анализатором, может там длина битовых интервалов на пределе допустимого.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, kov_serg, Вы писали:
_>>Хотя у вас
N>Это не у меня, я никак не связан с автором темы.
_>>>>убери flush _>>>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого N>>>Это сделает только хуже. _>>Не надо предположений. Просто попробуй.
N>Мне не на чем пробовать, но я таки прошу обоснований к этому пункту.
Некоторрые реализации flush могут не досылать данные, а просто сбрасывать контроллер uart.
соответственно если скорость 9600 то лучше не tcflush, а tcflush, sleep(2ms) т.к. 1байт ~ 1мс
Выдержать паузу очень важно. Т.к. помимо обычных rs232 бывают rs485 с длинной в километры, там еще интереснее глюки бывают.
N>По остальному — нет возражений (кроме неоднозначной "энергоёмкости" посылок).
Не очень понимаю что вызывает возражения. Это больше к физике процесса относится смотри телеграфное уравнение.
Если у тебя на линии есть чему поглащать сигнал, то более энергоёмкий пройдёт дальше и детектировать его проще.
Здравствуйте, kov_serg, Вы писали:
_>>>>>убери flush _>>>>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого N>>>>Это сделает только хуже. _>>>Не надо предположений. Просто попробуй. N>>Мне не на чем пробовать, но я таки прошу обоснований к этому пункту. _>Некоторрые реализации flush могут не досылать данные, а просто сбрасывать контроллер uart.
Никакая реализация _flush_ не должна _досылать_ данные. Вы с tcdrain() не попутали?
Или речь про вычистку буферов, а не "досылать"? Тогда, да, некоторые контроллеры требуют хотя бы частичного сброса. Это нормально.
_>соответственно если скорость 9600 то лучше не tcflush, а tcflush, sleep(2ms) т.к. 1байт ~ 1мс _>Выдержать паузу очень важно. Т.к. помимо обычных rs232 бывают rs485 с длинной в километры, там еще интереснее глюки бывают.
Верю. Но ТС явно сказал, что у него иной случай.
N>>По остальному — нет возражений (кроме неоднозначной "энергоёмкости" посылок). _>Не очень понимаю что вызывает возражения. Это больше к физике процесса относится смотри телеграфное уравнение. _>Если у тебя на линии есть чему поглащать сигнал, то более энергоёмкий пройдёт дальше и детектировать его проще.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, kov_serg, Вы писали:
_>>>>>>убери flush _>>>>>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого N>>>>>Это сделает только хуже. _>>>>Не надо предположений. Просто попробуй. N>>>Мне не на чем пробовать, но я таки прошу обоснований к этому пункту. _>>Некоторрые реализации flush могут не досылать данные, а просто сбрасывать контроллер uart.
N>Никакая реализация _flush_ не должна _досылать_ данные. Вы с tcdrain() не попутали?
Имелось ввиду "не досылать" от слова недосылать. Т.е. обрывать передачу на середине передаваемого слова.
N>Или речь про вычистку буферов, а не "досылать"? Тогда, да, некоторые контроллеры требуют хотя бы частичного сброса. Это нормально.
_>>соответственно если скорость 9600 то лучше не tcflush, а tcflush, sleep(2ms) т.к. 1байт ~ 1мс _>>Выдержать паузу очень важно. Т.к. помимо обычных rs232 бывают rs485 с длинной в километры, там еще интереснее глюки бывают.
N>Верю. Но ТС явно сказал, что у него иной случай.
N>>>По остальному — нет возражений (кроме неоднозначной "энергоёмкости" посылок). _>>Не очень понимаю что вызывает возражения. Это больше к физике процесса относится смотри телеграфное уравнение. _>>Если у тебя на линии есть чему поглащать сигнал, то более энергоёмкий пройдёт дальше и детектировать его проще.
N>Тогда идеал — последовательность повторов 0x0f.
Не обязательно: 0x00 пауза 0x00 пауза. Еще есть сигнал break
Здравствуйте, kov_serg, Вы писали:
_>>>>>>>убери flush _>>>>>>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого N>>>>>>Это сделает только хуже. _>>>>>Не надо предположений. Просто попробуй. N>>>>Мне не на чем пробовать, но я таки прошу обоснований к этому пункту. _>>>Некоторрые реализации flush могут не досылать данные, а просто сбрасывать контроллер uart. N>>Никакая реализация _flush_ не должна _досылать_ данные. Вы с tcdrain() не попутали? _>Имелось ввиду "не досылать" от слова недосылать. Т.е. обрывать передачу на середине передаваемого слова.
Ну, если что-то передавалось раньше, оно побьётся. Когда оно и так не нужно. В чём проблема?
Вы думаете, следующая передача может начаться, когда приёмник ещё ждёт предыдущий байт?
N>>>>По остальному — нет возражений (кроме неоднозначной "энергоёмкости" посылок). _>>>Не очень понимаю что вызывает возражения. Это больше к физике процесса относится смотри телеграфное уравнение. _>>>Если у тебя на линии есть чему поглащать сигнал, то более энергоёмкий пройдёт дальше и детектировать его проще. N>>Тогда идеал — последовательность повторов 0x0f. _>Не обязательно: 0x00 пауза 0x00 пауза. Еще есть сигнал break
break — это длинный ноль. 0x00 — это, грубо говоря, 9 единичных нулей. Пауза — сплошные единицы. Маловато общего.
Я бы понял ещё тестировать плотным потоком 0x00 или 0xff, это было бы проверкой качества передачи единичного бита противоположной полярности...
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, kov_serg, Вы писали:
_>>>>>>>>убери flush _>>>>>>>> // tcflush(Port, TCIOFLUSH); -- поробуй без этого N>>>>>>>Это сделает только хуже. _>>>>>>Не надо предположений. Просто попробуй. N>>>>>Мне не на чем пробовать, но я таки прошу обоснований к этому пункту. _>>>>Некоторрые реализации flush могут не досылать данные, а просто сбрасывать контроллер uart. N>>>Никакая реализация _flush_ не должна _досылать_ данные. Вы с tcdrain() не попутали? _>>Имелось ввиду "не досылать" от слова недосылать. Т.е. обрывать передачу на середине передаваемого слова.
N>Ну, если что-то передавалось раньше, оно побьётся. Когда оно и так не нужно. В чём проблема? N>Вы думаете, следующая передача может начаться, когда приёмник ещё ждёт предыдущий байт?
Многократно такое наблюдал.
N>>>>>По остальному — нет возражений (кроме неоднозначной "энергоёмкости" посылок). _>>>>Не очень понимаю что вызывает возражения. Это больше к физике процесса относится смотри телеграфное уравнение. _>>>>Если у тебя на линии есть чему поглащать сигнал, то более энергоёмкий пройдёт дальше и детектировать его проще. N>>>Тогда идеал — последовательность повторов 0x0f. _>>Не обязательно: 0x00 пауза 0x00 пауза. Еще есть сигнал break
N>break — это длинный ноль. 0x00 — это, грубо говоря, 9 единичных нулей. Пауза — сплошные единицы. Маловато общего. N>Я бы понял ещё тестировать плотным потоком 0x00 или 0xff, это было бы проверкой качества передачи единичного бита противоположной полярности...
тут дискуссия бесполезна. зависит от того чего вы хотите проверить.
Здравствуйте, andrey82, Вы писали:
A>Здравствуйте, indee, Вы писали:
I>>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>>Кабель серийного порта подключен к компьютеру где считываю данные.
I>>Параметры серийного порта: 9600, 8, evenparity, onestopbit
A>Подкину еще версии: A>1) Неточно согласованные скорости — частота порта (baudrate) формируется делением исходной частоты на целый коэффициент, что приводит к погрешностям. Актуально для МК со встроенным UART контроллером. К RPi скорее всего неприменимо, и искажения пакетов были бы практически постоянно. A>2) В RPi/Raspbian последовательный порт /dev/ttyAMA0 изначально используется системой (консолью), надо отключать использование порта. Возможно, что и в другие порты может какой-то процесс вклиниваться. A>3) Копать в сторону железа — как выполнено подключение к компьютеру? Кабель USB-UART на CP1202/FTDI со стороны ПК к UART линиям порта RPi? Или USB-RS232 адаптеры с обеих сторон? (/dev/ttyUSB0 намекает на этот вариант). В идеале посмотреть сигналы на линии логическим анализатором, может там длина битовых интервалов на пределе допустимого.
Устройства серийных портов на ПК и RPi реализованы USB FTDI адаптерами. Устройства надежные, использую их годами без проблем. A>3) В идеале посмотреть сигналы на линии логическим анализатором, может там длина битовых интервалов на пределе допустимого.
Это ... как?
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, indee, Вы писали:
I>>>>Но иногда вместо ожидаемого набора символов получаю такую последовательность: V>>>А иногда, это когда? С определённым периодом или случайно? I>>Случайно, примерно, 1 к 1000. V>Это относительно того набора, что в примере или, к примеру, здесь 1 это 1МБ данных, ну т.е. каждые 1ГБ?
Относитнльно набора.
Здравствуйте, indee, Вы писали:
A>>3) В идеале посмотреть сигналы на линии логическим анализатором, может там длина битовых интервалов на пределе допустимого. I>Это ... как?
Устройство такое.. позволяет получить совмещенные по времени графики логических уровней по нескольким каналам. Например, как здесь Logic. Кстати, китайский клон этого Saleae Logic (на 8 каналов) стоит вообще смешных денег. Только для подключения надо будет преобразовать уровни RS232 в обычный TTL (5В).
Как раз недавно искал причину проблем во взаимодействии RPi с устройством на МК — мне нужно было во время передачи данных в порт выставлять высокий уровень на одной из ножек GPIO, а по окончании передачи массива байт — сразу переключать на низкий (это для стыковки с RS485). С помощью анализатора увидел, что переключение происходило раньше, чем завершение передачи байт — Serial.Write() в Mono работал без ожидания завершения отправки байт в линию.
Здравствуйте, indee, Вы писали:
I>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>Но иногда вместо ожидаемого набора символов получаю такую последовательность: I>0 ᆰ 86
Наблюдал такое же с полусамодельным конвертором USB->UART.
Предположу, что дело может быть где-то в подтяжке с трех-вольтового UART RPi до пяти вольт, которые нужны USB.
А может и дребезг сказывался.
Осцилографом бы посмотреть. Приходилось когда-то видеть "пилообразные битики" в последовательном канале вместо "П-образных".
Здравствуйте, Mihas, Вы писали:
M>Здравствуйте, indee, Вы писали:
I>>Из Raspberry Pi в серийный порт пишу строку "0123456789\r". I>>Но иногда вместо ожидаемого набора символов получаю такую последовательность: I>>0 ᆰ 86
M>Наблюдал такое же с полусамодельным конвертором USB->UART. M>Предположу, что дело может быть где-то в подтяжке с трех-вольтового UART RPi до пяти вольт, которые нужны USB. M>А может и дребезг сказывался. M>Осцилографом бы посмотреть. Приходилось когда-то видеть "пилообразные битики" в последовательном канале вместо "П-образных".
У меня трех-вольтовые UART вообще не работают с RS232/ПК без усилителя.