我正在创建一个串口应用程序,我在其中创建两个线程,一个是WRITER THREAD,它将数据写入串口,一个READER THREAD将从串口读取数据。我知道如何打开,配置,读取和在串口上写数据但是如何使用线程来做。
我正在使用LINUX(ubuntu)并尝试在C中打开ttyS0端口编程。
答案 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个线程的串口很简单。
您应该为串行端口使用一个文件描述符。
使用普通open
,tcsetattr
等函数在一个线程中打开并初始化它。
然后将文件描述符传递给其他线程。
现在读者线程可以使用read()
函数,编写者可以使用write()
函数而无需任何额外的同步。您也可以在两个线程中使用select()
。
关闭文件描述符需要注意,你应该在一个线程中完成它以避免出现问题。