我正在开发一个嵌入式 linux 设备,该设备将自己作为 PC 的串行小工具提供。因此,在我看来,该设备是通信的主机/服务器,PC 可以连接到它并发送串行数据以通过串行协议进行通信。 我的设备有 /dev/ttyGS0,所以这部分工作正常。 在我的代码中,我打开了一个 fd 并等待连接,然后发送/接收同样有效的数据。
现在的问题是:当我第一次连接到我的设备时,一切正常。当我从我的 PC 上断开 USB 电缆并重新插入时,连接不再可能,因为我的嵌入式设备上打开 fd 的应用程序继续运行。然后我需要关闭并重新打开 ttyGS0 端口以重新获得连接和数据通信。
这个fd在那个部门工作得怎么样?为什么我需要关闭/打开 /dev/ttyGS0 上的 fd,即使它曾经连接并打开过? linux 中是否存在底层数据结构,其中实际数据现在位于 /dev/ttyGS0 的另一个实例上?
这里是应用程序中init进程的代码,运行在设备上并打开ttyGS0
TtySvr::TtySvr(char* port)
{
struct termios setup;
serialfd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
// reset io structure
bzero(&setup, sizeof(setup));
// modify port settings
setup.c_cflag |= B115200 | CS8 | CLOCAL | CREAD;
// minimum characters to read
setup.c_cc[VMIN] = 0;
// timeout in deciseconds
setup.c_cc[VTIME] = 1;
// set modified serial port settings
tcsetattr(serialfd, TCSAFLUSH, &setup)
// flush io buffers
tcflush(serialfd, TCIOFLUSH);
// create processing thread
ttywork = std::thread(TtySvr::ThreadProcessRx, this);
}
连接的实际处理是通过 ttywork 线程完成的,在该线程中传递了初始化类的引用。
该线程每 100 毫秒使用 rc = read(serialfd, &data, 1);
轮询一次 ttyGS0,并检查是否有数据可供读取,这对我来说似乎有点不雅,但由于它是遗留代码,我不应该解决这个问题。
我已经尝试读取 DTR 标志,但这不起作用。
当我拔下 USB 数据线时,udevadm monitor --kernel
也没有显示任何内容。
我有什么办法可以检测 USB 是否已连接,或者必须时不时关闭/打开 fd 以确保它始终处于良好状态?