Мониторинг обмена данными с serial-портом

17 Dec 2014

Иногда надо сниффать serial-порт на предмет того, что туда пишется/читается софтиной.
Есть сниффер jpnevulator.

jpnevulator --timing-print --tty /dev/ttyACM0

Но он не совсем удобен. Так как он не сниффер на смом деле, а простой ридер-писатель для порта.
Поэтому если запустить его совместно с другой софтиной, то она данных на порту не увидит.

А нам нужен именно сниффер.

Можно создать виртуальный порт с помощью pyserial. И читать/писать данный и реального в виртуальный порт и наоборот (MITM), но стоит ли? :)

Воспользуемся strace!

$ strace -e trace=read,write python terminal.py  
# тут я вырезал кусок, который относится к питону  
write(3, "P", 1)                        = 1  
write(3, "P", 1)                        = 1  
read(3, "P", 1)                         = 1  
read(3, ";\26\225\320\0k,\r\0", 9)      = 9  
write(1, "3B 16 95 D0 0 6B 2C D 0\n", 243B 16 95 D0 0 6B 2C D 0  
) = 24  
write(3, "S\3\377\0\377", 5)            = 5  
read(3, "\377\0\377", 3)                = 3  
write(1, "FF 0 FF\n", 8FF 0 FF  
)                = 8  
write(3, "S\5\240\244\0\0\2", 7)        = 7  
read(3, "\244", 1)                      = 1  
write(3, "S\2?\0", 4)                   = 4  
read(3, "\237#", 2)                     = 2  
write(1, "9F 23\n", 69F 23  
)                  = 6  
write(3, "S\5\240\300\0\0#", 7)         = 7  
read(3, "\300\0\0Z\0?\0\1\0\0\0\0\0\26\263\3\7\4\0\203\212\203\212\0\3\0\0Z\0\0\0Z"..., 38) = 38  
write(1, "C0 0 0 5A 0 3F 0 1 0 0 0 0 0 16 "..., 89C0 0 0 5A 0 3F 0 1 0 0 0 0 0 16 B3 3 7 4 0 83 8A 83 8A 0 3 0 0 5A 0 0 0 5A 0 2F 6 2 90 0  
) = 89  
write(3, "H", 1)                        = 1  
+++ exited with 0 +++

И вот уже вожделенный протокол обмена на экране. :)

Теги: отладка python

Категории: Разработка