繁体   English   中英

如何使用线程在串口上读写数据

[英]how to read and write data on serial port using threads

我正在创建一个串口应用程序,我在其中创建两个线程,一个是WRITER THREAD,它将数据写入串口,一个READER THREAD将从串口读取数据。我知道如何打开,配置,读取和写入数据串口,但如何使用线程。

我正在使用LINUX(ubuntu)并尝试在C中打开ttyS0端口编程。

我过去这样做的方法是使用VMIN为0和VTIME(例如5分秒)设置异步I / O端口。 这样做的目的是允许线程注意应用程序关闭的时间,因为它可能会尝试读取,超时,检查退出标志,然后尝试阅读更多内容。

这是一个示例读取函数:

size_t myread(char *buf, size_t len) {
    size_t total = 0;
    while (len > 0) {
        ssize_t bytes = read(fd, buf, len);
        if (bytes == -1) {
            if (errno != EAGAIN && errno != EINTR) {
                // A real error, not something that trying again will fix
                if (total > 0) {
                    return total;
                }
                else {
                    return -1;
                }
            }
        }
        else if (bytes == 0) {
            // EOF
            return total;
        }
        else {
            total += bytes;
            buf += bytes;
            len -= bytes;
        }
    }

    return total;
}

写函数看起来像你期望的那样。

在您的设置功能中,请务必设置:

struct termios tios;
...
tios.c_cflag &= ~ICANON;
tios.c_cc[VMIN] = 0;
tios.c_cc[VTIME] = 5; // You may want to tweak this; 5 = 1/2 second, 10 = 1 second, ...
...

我情况非常相似。

我的主题正在使用此代码:

HANDLE thandle; 
thandle = (HANDLE) _beginthread(ThreadProc_Read,0,&serial); // create thread
WaitForSingleObject(thandle,INFINITE);

void ThreadProc_Write(void *param)
{

    LONG    lLastError = ERROR_SUCCESS;
    printf("Thread is Running!\n");

    MpHostSendCommandReadBluetoothAddr(param);

    _endthread();

}

问题是在任何写事件上都会对读取做出反应。 我正在使用重叠I / O来捕获我的读取线程中的任何新的wirte事件,但它无法正常工作。 我无法捕捉到我的写线程引起的响应。 在这件事上,我太过于无所畏惧了。

如果只有一个线程读取而其他线程只写入,则使用来自2个线程的串行端口很简单。

您应该为串行端口使用一个文件描述符。

使用常规opentcsetattr等函数在一个线程中打开并初始化它。 然后将文件描述符传递给其他线程。

现在读者线程可以使用read()函数,而write()可以使用write()函数而无需任何额外的同步。 您还可以在两个线程中使用select()

关闭文件描述符需要注意,你应该在一个线程中完成它以避免问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM