基于STM32的USB CDC固件尚未在Linux中输出

时间:2017-12-29 11:35:58

标签: usb keil usbserial

我正在设计一个带有RF收发器和OpenWRT的物联网项目。 RF收发器具有板载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的STM32F103 / F072 HAL SDK。您可以从mbed

中找到参考代码

在Python之后,我尝试了lua的io.open,以及使用cat / echo命令进行串口编程。我很确定我的设备(mbed CDC)在Linux中运行良好。

我还测试了MicroPython(基于STM32F4XX HAL),STLINKV2中的内置CDC(STM32F103)和Keil RTX USB CDC演示(STM32F103)。前两个在Windows / Linux中运行良好,Keil没有。

目前我正在尝试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

以上记录由两个会话组成,一个用于只读,后一个用于写&#34; Hello World \ r \ n&#34;只要。对于bulkin而言,USB似乎没有输出。

更多操作系统更新

在收到STM32F103C8T6_USBSerial作者的消息后,我尝试了一些最新的Linux disto,包括Ubuntu 15.04桌面。该固件适用于gtkterm和stty / cat / echo等工具。现在,问题在矩阵中变得复杂:

  • STM32F103C8T6_USBSerial在Ubuntu 15.04桌面上运行,在Ubuntu 12.04 / 14.04桌面和OpenWRT中失败。
  • 其他固件几乎适用于所有Linux disto。

现在,这是一个兼容性问题。固件适用于最新的操作系统,在旧版本中失败。现在我必须关注如何找到根本原因。

0 个答案:

没有答案