2016-11-30 5 views
2

У меня есть Linux SBC на базе Atmel SAMA5D36. У меня есть другое устройство, подключенное к нему через/dev/ttyS2 через TTL-линии (115200 8N1). Используя pyserial, у меня есть довольно высокоскоростной запрос на запрос/ответ с этим устройством.Weird (py) последовательное повреждение linux

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

"123456" (ascii character values) 

Он будет падать на один символ и добавить символ-0 после следующего характера:

"13\x00456" 

Надеется, что это ясен. Он сбросит 2, следующий символ будет таким, как ожидалось, после этого появится символ-0, а затем вернется в нормальное состояние.

Я использую ядро ​​4.1.10. Через некоторые операторы отладки, я уверен, что этого не происходит в моем цикле питона, потому что 0 отображаются в случайных точках буфера read(). Я также подключил область на входящих линиях и подтвердил, что провод не несет этого повреждения.

Я ищу ответ, который поможет мне в правильном направлении выяснить, почему это происходит. Загрузка ЦП кажется для увеличения частоты (например, когда я делаю кучу трафика DBUS для присоединенного адаптера BLE).

+0

Что вы подразумеваете под «довольно высокой пропускной способностью»? Вы говорите, что вы «подтвердили, что провод не несет этого искажения» - на самом деле это довольно сложно сделать с аналоговой областью, если эта ошибка происходит только раз в минуту, и происходит много потоков данных. Одна из возможностей заключается в том, что ваш SBC uart превосходит серийный Rx, возможно, потому что другие прерывания с более высоким приоритетом блокируют uart для> 80us-ish, что является характерным временем при 115200 бодах. Или, если uart имеет, например, 16-байтовый rx fifo, а прерывания блокируются для> 1 мс-иш, хотя это кажется маловероятным. – barny

+0

Я буду использовать его завтра, когда я нахожусь на машине, чтобы получить более подробный ответ на высокой пропускной способности. –

+0

Я проверил отсутствие коррупции на проводе (прямо он подключался к контактам на Linux SBC) с помощью PicoScope, который может выполнять последовательное декодирование потока. Получив мое программное обеспечение для управления штырем gpio, когда я обнаруживаю неожиданный ноль, я могу вызвать область действия на этом, а затем сравнить характер для персонажа, что произошло, и что вышло на стороне pyserial. –

ответ

2

Это может быть результатом ошибок переполнения. Если вы посмотрите atmel_serial, вы увидите, есть ли какие-либо ошибки.

cat /proc/tty/driver/atmel_serial 

Например, на ttyS2 вы можете увидеть что-то вроде этого (ая: показывают ошибки переполнения):

2: uart:ATMEL_SERIAL mmio:0xF0020000 irq:31 tx:266758 rx:361385 oe:51 RTS|DTR|DSR|CD|RI 

Поскольку вы высокая скорость последовательной можно попробовать реализовать DMA на USART линиях. Tweak соответствующего файла DTs в ядре, добавив следующую строку в настройки USART:

atmel,use-dma-rx; 
atmel,use-dma-tx; 

Для моего ядра, я должен был отключить SPI и I2C, так что будет достаточно каналов DMA, доступные для USART.

+0

Это меня достало! Благодаря! Переместился и в более новое ядро. –