簡體   English   中英

Linux串口問題

[英]Linux serial port woes

我正在編寫代碼以通過Linux中的串行口與另一台設備通訊

我希望即使有0個字符到達也不會超時超時。 termios結構允許您設置VTIME和VMIN,但是如果VMIN大於0,並且返回0個字符,則讀取調用將永遠阻塞... WTF,為什么。 這似乎無法解決其他設備在短時間內關閉而現在我的應用程序在讀取調用中被阻止的情況。 這似乎是一種至關重要的行為,可以忽略。 我真的不想實現自己的超時。

Write command
Read block timeout of around .3s(if 0 characters, still wait max of .3s)

如果你想read一個超時后沒有數據返回,您可以設置MIN == 0TIME > 0 來自tcsetattr(3)

MIN == 0; TIME> 0:TIME以十分之一秒為單位指定計時器的限制。 調用read(2)時啟動計時器。 當至少一個字節的數據可用或計時器到期時,read(2)返回。 如果計時器到期而沒有任何可用的輸入,則read(2)返回0。

此模式可用於構建更高級別的通信功能,您必須始終實現這些功能,以處理部分讀取(即,如果另一端在“數據包”中間崩潰),錯誤的數據包,拆分的數據包等。 這就是簡單read無法為您完成的所有工作。

看一下select 它等待直到數據准備好讀取(但實際上不讀取任何內容)。 手冊頁

超時select()返回之前經過的時間的上限。 它可能為零,導致select()立即返回。 (這對輪詢很有用。)如果超時為NULL(無超時),則select()可以無限期阻塞。

代碼看起來像:

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 300000;

fd_set infds;
FD_ZERO(&infds);
FD_SET(fd, &infds);

// Assume fd is the file descriptor for the serial device
if (select(fd + 1, &infds, NULL, NULL, &tv) > 0)
{
    // The read will not block now
    // Assume buffer and size are declared and set appropriately
    amountRead = read(fd, buffer, size);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM