如何使用线程读取和写入串行端口上的数据
问题描述:
我正在创建一个串行端口应用程序,我在其中创建两个线程,一个是将数据写入串行端口的WRITER THREAD和一个将从串行端口读取数据的READER THREAD 。我知道如何在串口上打开,配置,读写数据,但是如何使用线程来完成。如何使用线程读取和写入串行端口上的数据
我使用的Linux操作系统(Ubuntu的),并试图在C.
答
打开ttyS0来口编程我在过去做到了这一点的方法是建立端口异步I/O使用的0 VMIN以及例如5个十分秒的VTIME。这样做的目的是让线程在应用程序关闭的时候能够注意到,因为它可以尝试读取,超时,检查退出标志,然后尝试读取更多内容。
下面是一个例子读取功能:
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, ...
...
答
我在一个非常类似的情况。
我的线程与此代码的工作:
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();
}
麻烦的是contantly与读反应上的任何写事件。我正在使用重叠的I/O在我的读取线程中捕获任何新的事件事件,但它无法正常工作。我无法捕捉到我的写入线程引发的响应。我对这件事的任何帮助太感激。
答
如果只有一个线程读取,而其他线程只写入,则使用2个线程中的串行端口很简单。
您应该为串行端口使用一个文件描述符。
使用正常的open
,tcsetattr
等函数在一个线程中打开并初始化它。 然后将文件描述符传递给其他线程。
现在读者线程可以使用read()
函数,并且编写者可以使用write()
函数而不需要任何额外的同步。您也可以在两个线程中使用select()
。
关闭文件描述符需要注意,你应该在一个线程中执行以避免问题。
是什么让你相信串口不能同时发送和接收? – Lundin 2011-03-16 14:25:50
我不想同时发送和接收数据。我将首先写入数据,之后我将使用reader线程读取写入的数据。实际上,我想使用线程实现它,否则没有线程我已经完成了它,请告诉我如何使用线程实现它。 – tejendra 2011-03-16 15:06:34
@Lundin串行端口连接包含准备发送和准备接收引脚,专门用于控制哪一侧能够在给定时刻发送数据,因为双方不能同时发送数据。我相信这是并行端口的作用。 – Jonathan 2011-03-16 15:35:09