我在 Windows 主机上有应用程序,它通过 RS232 连接到板设备,并带有完全握手(RTS、CTS、DTR)。我现在想用 USB 替换 RS232。我使用带有嵌入式 linux 和 USB 设备 (g_serial) 模块的板。我在终端双方都获得了所有数据,但应用程序无法处理它(缺少握手信号)。怎么可能处理它?(主机或设备端)也许有一些握手“模拟器”关心 PC 主机端的握手?
BR Bartlomiej Grzeskowiak
我查看了Linux内核中驱动程序的内核(最初是3.8,后来是4.11)源代码g_serial
,看看它是否实现了API来控制Linux端API(/dev/ttyGS0
)上的硬件握手线。例如:
#include <unistd.h>
#include <termios.h>
int fd;
int status;
...
ioctl(fd, TIOCMGET, &status);
status |= TIOCM_DTR;
ioctl(fd, TIOCMSET, &status);
看起来好像驱动程序不支持它。在drivers/usb/gadget/function/u_serial.c
中,查看struct tty_operations gs_tty_ops
哪些没有定义通常需要支持上述代码的.tiocmset
or成员。.tiocmget
所以我认为需要改进驱动程序以添加此支持。
如果底层驱动程序实现 CDC ACM 类,则使用 SET_CONTROL_LINE_STATE (0x22) 请求设置控制线状态。当设置控制线状态时,Windows 肯定会发出此请求,并且也会从设备响应该请求。
然而,这些信号对 USB 传输没有影响,因为底层 USB 协议有自己的流量控制机制。两端的应用程序都需要处理信号。例如,在 Windows 中,您必须为端口显式启用硬件流控制。