在 x86_64 miniPC 上,可以控制 LED 灯带在串行端口上发送一些字节。此控制在 Windows 上有效,但在 Linux 上无效。
在 Windows 上,PowerShell 中的以下几行可以关闭 LED 灯带:
$port = new-Object System.IO.Ports.SerialPort COM3, 9600, None, 8, one
$port.Open()
$bytes = [byte[]] (0xfa, 0x04, 0x03, 0x03, 0x04)
$port.Write($bytes, 0, $bytes.Length)
$port.Close()
在 Linux 上,这些行应该执行相同的操作(root 用户):
SERIAL_PORT="/dev/ttyUSB0"
stty -F $SERIAL_PORT cs8 -cstopb -parenb 9600
printf "\xfa\x04\x03\x03\x04" > $SERIAL_PORT
但 LED 灯带仍然亮着。
我还用 QSerialPort 编译了一个基本的 Qt5 应用程序:Windows 和 Linux 的源代码相同。结果是一样的,即 Windows 应用程序提供了良好的结果,而 Linux 应用程序没有效果。
所以我怀疑Linux驱动程序CH341。
以下是一些内核日志:
3.587111] usbcore: registered new interface driver usbserial_generic
3.587120] usbserial: USB Serial support registered for generic
3.589539] usbcore: registered new interface driver ch341
3.589549] usbserial: USB Serial support registered for ch341-uart
3.589564] ch341 1-7:1.0: ch341-uart converter detected
3.612837] usb 1-7: ch341-uart converter now attached to ttyUSB0
在 Windows 上,驱动程序是 CH340 版本 1.3.0
我读过了此 StackOverflow 主题但它是 9 年前写的。它谈到了一些未实现的 ch341 功能。
在原始内核中,驱动程序现在实现了以下功能: Vanilla 内核驱动程序 ch341
参见函数 ch341_set_termios
南京秦恒电子编写的旧驱动程序版本处理停止位和奇偶校验。
我也整理了这个修补驱动程序虽然模块已经安装并且 /dev/ttyUSB0 已暴露,但没有成功。
lsmod | grep ch34x
ch34x 24576 0
usbserial 69632 1 ch34x
我该如何修复此问题?