在Linux下編寫Modbus協議的串口接收驅動時,之前看過幾種其他實現方式,但都不理想。以下提出一種實現方式,經工程應用後發現比較簡單可靠,并且穩定。
Modbus協議串口接收實現方式的主要思路是:
(1) 當前串口有接收數據,開始計時;
(2) 如果一定時間内,串口又有接收數據,則重新開始計時;
(3) 如果一定時間後,串口沒有接收數據,則認為上一幀接收完畢。
通過查閱資料得知,Linux有API函數能夠随時查詢串口上當前可讀取的字節數,所以對處理串口接收及幀間隔的邏輯進行簡化,流程圖如圖1所示。
圖1 Linux下modbus接收處理邏輯
對應的程序代碼如圖2所示。
#elif (COM_READ_STYLE_SELECT == COM_READ_STYLE_WAIT)
int nread1, nread2;
ioctl(com_fd_using, FIONREAD, &nread1);//獲取串口當前可讀取的字節數
if(nread1 > 0)//如果字節數大于0
{
usleep(RECV_FRAME_TIME_INTERVAL * 1000);//延時一定時間,取決于幀間隔
ioctl(com_fd_using, FIONREAD, &nread2);//再次獲取串口當前可讀取的字節數
if(nread2 == nread1)//如果兩次字節數一樣,說明系統底層已接收完一個完整數據幀
{
nread1 = nread2 > datalength ? datalength : nread2;//取可用字節數和要讀取字節數中的較小者
nread2 = read(com_fd_using, data, nread1);//從系統底層讀取串口接收數據
return nread2;//返回實際讀取的字節數
}
else
{
return 0;//如果兩次字節數不一樣,說明系統底層還未接收完一個完整數據幀,則返回0
}
}
else
{
return 0;//如果沒有可讀取數據,則返回0
}
#endif
圖2 Linux下modbus接收處理代碼
該方法已經在工程實踐中驗證過,簡單可靠,并且穩定。
如需要源代碼及測試例程,可聯系我獲取。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!