我正在创建一个串口应用程序,其中我创建了两个线程,一个是写入器线程,它将数据写入串口,另一个是读取器线程,它将从串口读取数据。我知道如何在串口上打开、配置、读取和写入数据,但如何使用线程来实现。
我正在使用LINUX(ubuntu),并尝试用C打开ttyS0端口编程。
发布于 2011-03-16 22:07:19
我过去这样做的方法是使用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;
}write函数看起来就像您所期望的那样。
在设置函数中,请确保设置:
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, ...
...发布于 2012-08-30 18:28:31
如果只有一个线程读,其他线程只写,那么从两个线程使用串行端口是很简单的。
您应该为串行端口使用一个文件描述符。
使用普通的open、tcsetattr等函数在一个线程中打开并初始化它。然后将文件描述符传递给其他线程。
现在读取器线程可以使用read()函数,写入器可以使用write()函数,而不需要任何额外的同步。您还可以在这两个线程中使用select()。
关闭文件描述符需要注意,你应该在一个线程中关闭它,以避免出现问题。
https://stackoverflow.com/questions/5326255
复制相似问题