各位大神:
平臺:VS2013,MFC
我在網上看到你發的一篇《C++串口編程實體》,鏈接http://blog.csdn.net/jiangqin115/article/details/40391289
加入工程使用測驗后,在接收時有不穩當現象,具體如下描述:
1、 使用串口:9600 baud,1 start-bit,1 stop-bit,no partities;
2、 發送正常,但在接收時,偶爾有拆包的情況出現,
const UINT SLEEP_TIME_INTERVAL = 5;
/** 設定串口的超時時間,均設為0,表示不使用超時限制 */
COMMTIMEOUTS CommTimeouts;
CommTimeouts.ReadIntervalTimeout = 0;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 0;
// 執行緒回圈,輪詢方式讀取串口資料
while (!pSerialPort->s_bExit)
{
UINT BytesInQue = pSerialPort->GetBytesInCOM();
/** 如果串口輸入緩沖區中無資料,則休息一會再查詢 */
if ( BytesInQue == 0 )
{
Sleep(SLEEP_TIME_INTERVAL);
continue;
}
bResult = ReadFile(m_hComm, ptr, BytesInQue , &BytesRead, NULL);
}
比如,實際有發30個位元組,但GetBytesInCOM()只取到8個位元組就回傳了,剩余22個位元組下一次才回傳,就把一個資料包變成兩次回傳;
當把SLEEP_TIME_INTERVAL間隔從5ms增加到100ms,發生這種不能一次取完概率會變小,但還是會出現。
我用虛擬串口就沒啥問題了,很穩定,難道是硬體中斷的問題?
如何保證每次接收一個完整的資料包?
謝謝!
在線等!
uj5u.com熱心網友回復:
根本無法保證...如果能保證的話.那么還要什么"協議" ?
又是頭尾 又是校驗的 這些東西存在的意義是什么?
所以在保證不了"完整"包的情況下.必須要通過所謂的"協議"來自己組裝成一個完整的包.
uj5u.com熱心網友回復:
是不是一定需要自己根據通信協議來判斷,來重新拼或是拆,來組成完整的資料包?如果這樣,有什么好的策略來完成接收到的資料包后續處理呢?
uj5u.com熱心網友回復:
應該利用協議不保證的,虛擬串口,其實是純usb實作的,收、發都有快取,造成效果不一致。uj5u.com熱心網友回復:
比如說你們的信令設計是“每一個訊息用 \r”結束,那么在你接收訊息時,最后一個位元組不是 \n 就不能進行訊息決議(應該快取起來),而假設是 \n 的話要將快取的所有位元組根據\n分割為多條訊息,然后逐一決議處理。真正合格的通訊程式,根本不寫什么 Sleep。寫了它就是坑自己的,因為你根本不知道該 Sleep 多少毫秒合適,而且這種故意減慢通訊速度的程式一看就是很難令人接受的,是技術上無奈。
uj5u.com熱心網友回復:
比如說你們的信令設計是“每一個訊息用 \r”結束 --> 比如說你們的信令設計是“每一個訊息用 \n”結束uj5u.com熱心網友回復:
所謂“通訊協議”,可以說會者不難難者不會。頂多就是經驗問題。
總共也就十幾行代碼而已,關鍵在于悟性、在于主動性,沒有一個真正程式員不會編程,不會這個基本上是不可能通程序式員考試的。
uj5u.com熱心網友回復:
你好,請問根據特定的字符或符號分割為多條訊息后,怎么進行逐一處理呢?回圈嘛,具體怎么實作呢麻煩指導一下,謝謝了uj5u.com熱心網友回復:
串口接收,我的做法是每次只接收一個位元組,然后……uj5u.com熱心網友回復:
繼續寫完啊!uj5u.com熱心網友回復:
自己定義幀頭幀尾 資料位 控制位 校驗位等 這些東西就是為了防止丟包、串包而存在的轉載請註明出處,本文鏈接:https://www.uj5u.com/net/80456.html
標籤:VC.NET
