首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用线程在串口上读写数据

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

Stack Overflow用户
提问于 2011-03-16 21:47:57
回答 2查看 11K关注 1票数 3

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

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

EN

回答 2

Stack Overflow用户

发布于 2011-03-16 22:07:19

我过去这样做的方法是使用VMIN为0和VTIME为比方说5分秒来设置异步I/O端口。这样做的目的是让线程注意到应用程序何时关闭,因为它可以尝试读取、超时、检查退出标志,然后尝试读取更多内容。

下面是一个读取函数的示例:

代码语言:javascript
复制
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;
}

write函数看起来就像您所期望的那样。

在设置函数中,请确保设置:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-08-30 18:28:31

如果只有一个线程读,其他线程只写,那么从两个线程使用串行端口是很简单的。

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

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

现在读取器线程可以使用read()函数,写入器可以使用write()函数,而不需要任何额外的同步。您还可以在这两个线程中使用select()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5326255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档