2011-03-16 173 views
3

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

我使用的Linux操作系统(Ubuntu的),并试图在C.

回答

1

打开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, ... 
... 
+3

是什么让你相信串口不能同时发送和接收? – Lundin 2011-03-16 14:25:50

+0

我不想同时发送和接收数据。我将首先写入数据,之后我将使用reader线程读取写入的数据。实际上,我想使用线程实现它,否则没有线程我已经完成了它,请告诉我如何使用线程实现它。 – tejendra 2011-03-16 15:06:34

+0

@Lundin串行端口连接包含准备发送和准备接收引脚,专门用于控制哪一侧能够在给定时刻发送数据,因为双方不能同时发送数据。我相信这是并行端口的作用。 – Jonathan 2011-03-16 15:35:09

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(); 

} 

麻烦的是contantly与读反应上的任何写事件。我正在使用重叠的I/O在我的读取线程中捕获任何新的事件事件,但它无法正常工作。我无法捕捉到我的写入线程引发的响应。我对这件事的任何帮助太感激。

0

如果只有一个线程读取,而其他线程只写入,则使用2个线程中的串行端口很简单。

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

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

现在读者线程可以使用read()函数,并且编写者可以使用write()函数而不需要任何额外的同步。您也可以在两个线程中使用select()

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

相关问题