2011-03-16 174 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()

關閉文件描述符需要注意,你應該在一個線程中執行以避免問題。

相關問題