Прошивка USB CDC на базе STM32 не выводится в Linux
Я разрабатываю проект IoT с РЧ трансивером и OpenWRT. Радиопередатчик имеет встроенный STM32 micro, и к нему можно получить доступ в Windows как "COMx". Я планирую использовать последовательный и сокет-модуль в Python для создания быстрого решения. Но устройство в Linux все равно не работает.
Тестовый код очень прост.
#!/usr/bin/env python
import serial
#ser = serial.Serial('COM12',9600,timeout=0.3)
ser = serial.Serial('/dev/ttyACM0',9600,timeout=0.3)
while True:
l = ser.readline()
print(l)
Я тестировал код в Windows, Ubuntu, Raspiberry-Pi и OpenWRT. Он отлично работает в Windows. Однако в Linux readline() печатает только один ведущий символ, а остальные вызовы readline() возвращают None.
Вот мое краткое изложение конфигурации оборудования: в OpenWRT Python - 2.7.3, pyserial - 2.4. и мой код CDC/ACM взят из ST ST3232F103/F072 HAL SDK компании ST. Вы можете найти код ссылки от mbed
После Python я попробовал lo io.open и программирование оболочки для последовательных команд с помощью команд cat/echo. Я почти уверен, что мое устройство (mbed CDC) не работает хорошо в Linux.
Я также протестировал MicroPython (на основе STM32F4XX HAL), встроенный CDC в STLINKV2 (STM32F103) и демонстрационную версию Keil RTX USB CDC (STM32F103). Первые два хорошо работают в Windows/Linux, Кейл - нет.
В настоящее время я пытаюсь отладить usbmon и найти основную причину, так как стек USB довольно сложен, а встроенное ПО сложно отлаживать в режиме реального времени, мне нужен опыт в такой междоменной разработке.
Вот мой лог usbmon:
f3e3f9c0 857391360 S Ii:1:004:1 -115:2 16 <
f3f2e180 857391559 S Co:1:004:0 s 21 22 0003 0000 0000 0
f3f2e180 857414072 C Co:1:004:0 0 0
f3e3fa80 857414467 S Bi:1:004:2 -115 128 <
f3e3fb40 857414547 S Bi:1:004:2 -115 128 <
f3e3ff00 857414595 S Bi:1:004:2 -115 128 <
f3e3fe40 857414636 S Bi:1:004:2 -115 128 <
f3e3f900 857414676 S Bi:1:004:2 -115 128 <
f3e3f780 857414716 S Bi:1:004:2 -115 128 <
f3e3f6c0 857417325 S Bi:1:004:2 -115 128 <
f3e3f600 857417399 S Bi:1:004:2 -115 128 <
f3e3fc00 857417435 S Bi:1:004:2 -115 128 <
f3e3fcc0 857417469 S Bi:1:004:2 -115 128 <
f3e3f540 857417502 S Bi:1:004:2 -115 128 <
f3e3f480 857417533 S Bi:1:004:2 -115 128 <
f3e3f3c0 857417565 S Bi:1:004:2 -115 128 <
f3e3f300 857417594 S Bi:1:004:2 -115 128 <
f3e3f240 857417622 S Bi:1:004:2 -115 128 <
f3e3f180 857417650 S Bi:1:004:2 -115 128 <
f3e3f9c0 1138689644 S Ii:1:004:1 -115:2 16 <
f51fd6c0 1138692116 S Co:1:004:0 s 21 22 0003 0000 0000 0
f51fd6c0 1138703025 C Co:1:004:0 0 0
f3e3fa80 1138703444 S Bi:1:004:2 -115 128 <
f3e3fb40 1138703524 S Bi:1:004:2 -115 128 <
f3e3ff00 1138703570 S Bi:1:004:2 -115 128 <
f3e3fe40 1138703610 S Bi:1:004:2 -115 128 <
f3e3f900 1138703652 S Bi:1:004:2 -115 128 <
f3e3f780 1138703692 S Bi:1:004:2 -115 128 <
f3e3f6c0 1138703817 S Bi:1:004:2 -115 128 <
f3e3f600 1138703865 S Bi:1:004:2 -115 128 <
f3e3fc00 1138703906 S Bi:1:004:2 -115 128 <
f3e3fcc0 1138703947 S Bi:1:004:2 -115 128 <
f3e3f540 1138703987 S Bi:1:004:2 -115 128 <
f3e3f480 1138704026 S Bi:1:004:2 -115 128 <
f3e3f3c0 1138704066 S Bi:1:004:2 -115 128 <
f3e3f300 1138704106 S Bi:1:004:2 -115 128 <
f3e3f240 1138704147 S Bi:1:004:2 -115 128 <
f3e3f180 1138704188 S Bi:1:004:2 -115 128 <
f6c65840 1138704450 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65cc0 1138704878 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65d80 1138704970 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65600 1138705045 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65240 1138705117 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65000 1138705189 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c659c0 1138705261 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65b40 1138705333 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c656c0 1138705459 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65300 1138705515 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65f00 1138705559 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65900 1138705603 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
f6c65780 1138705646 S Bo:1:004:2 -115 13 = 48656c6c 6f20776f 726c640d 0a
Выше журнал состоит из двух сеансов, один только для чтения, последний предназначен только для записи "Hello World\r\n". Вроде нет выхода с USB на булкин.
Обновление для Больше ОС
Получив сообщение от автора STM32F103C8T6_USBSerial, я попробовал несколько последних версий Linux disto, включая рабочий стол Ubuntu 15.04. Прошивка хорошо работает с gtkterm и stty/cat/echo и другими инструментами. Теперь проблема становится сложной в матрице:
- STM32F103C8T6_USBSerial работает в настольном компьютере Ubuntu 15.04, не работает в настольном компьютере Ubuntu 12.04/14.04 и OpenWRT.
- Другие прошивки работают практически во всех дистрибутивах Linux.
Теперь это проблема совместимости. Прошивка работает для последних версий ОС, не удалась в старших версиях. Теперь я должен сосредоточиться на том, как определить причину.