检查 ttyGS0 是否已重新插入或什至已连接

时间:2021-02-17 14:39:36

标签: c++ linux serial-port embedded-linux tty

我正在开发一个嵌入式 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 以确保它始终处于良好状态?

0 个答案:

没有答案
相关问题