我正在創建一個串行端口應用程序,我在其中創建兩個線程,一個是將數據寫入串行端口的WRITER THREAD和一個將從串行端口讀取數據的READER THREAD 。我知道如何在串口上打開,配置,讀寫數據,但是如何使用線程來完成。如何使用線程讀取和寫入串行端口上的數據
我使用的Linux操作系統(Ubuntu的),並試圖在C.
我正在創建一個串行端口應用程序,我在其中創建兩個線程,一個是將數據寫入串行端口的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