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

时间:2011-03-16 13:47:57

标签: c multithreading serial-port

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

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

3 个答案:

答案 0 :(得分:1)

我过去这样做的方法是使用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, ...
...

答案 1 :(得分:0)

我情况非常相似。

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

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 :(得分:0)

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

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

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

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

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