c - 如何使用线程读写串口数据

标签 c multithreading serial-port

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

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

最佳答案

我过去执行此操作的方法是使用 0 的 VMIN 和 5 十分之一的 VTIME 设置异步 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, ...
...

关于c - 如何使用线程读写串口数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5326255/

相关文章:

C - 根据格式读入文件

无符号字符数组的 C memcpy 问题

java - 一个额外的线程极大地提高了性能

python - 创建一个线程安全的装饰器类

c# - 来自线程的异常不会冒泡到主线程

c# - 如何避免 Epson EPOS 上的缓冲区溢出(通过串口)?

matlab - 从 SerialForwarder 的套接字读取数据

PHP fsockopen() 失败未打开端口但 telnet 工作

c - 从随机维度数组中查找值的索引

c - 如何将一个库的全局变量使用到另一库