下位機一次發送了5000個位元組。我通過串口接收一次只能接受4096個位元組。剩下的位元組必須在發送一次命令,讓下位機回傳資料,此時回傳的資料包括2個部分,第一部分為剛才沒收完的資料,第2部分為這次命令該回傳的資料。感覺就是緩沖區只有4096.
設定成更大緩沖區不管用。請教一下,在不改變下位機的情況下,有可能改變上位機,讓上位機可以一次接收完5000個資料嗎
uj5u.com熱心網友回復:
串口既然是串行的,那么每次只能發送一個二進制資料位。至于你說的多少位元組,這個是你上位機緩沖區的大小,這個是你自己控制的。你記憶體大,理論上搞一個100GB的也沒事。uj5u.com熱心網友回復:
緩沖區決定一次接收資料大小,而緩沖區是你自己設定的uj5u.com熱心網友回復:
就算是你設定所謂緩沖區為1個位元組,也是可以接受完5000個位元組的訊息內容的。處理 DataReceived 時,要處理不斷處理鎖觸發的接收事件。難道你以為觸發一次事件、執行一次 Read 陳述句就算是收完了一條訊息?
uj5u.com熱心網友回復:
一看你糾結所謂緩沖區應該多“大”,就能看出問題來了。這個數值設定1個太小,設定5000算不算也太小?設定為1M是不是也小?萬一所謂下位機發來的訊息敲好是1M零1個位元組呢?這問題出自錯誤的邏輯,沒有什么答案。
uj5u.com熱心網友回復:
下位機發送時會自動分包的,最大就是4096,大于4096時就需要你在上位機自己組包,每個包頭加一個編號uj5u.com熱心網友回復:
串行接收,現在最差的單片機都能夠完全有能力處理完,所以現在沒有流控制,沒有大家通知下忙不忙,有沒有時間接收了。你資料一直不處理,當然會溢位。或者你非要等到5k才處理。一般串口硬體只有1個位元組緩沖,其他都是系統自己的記憶體做暫存緩沖的,而且一般不會很大。最好自己設定一個記憶體,多少取決于你的記憶體大小,中斷訊息處理串口資料,存到自己的緩沖區,等到位元組到了你需要的,再從緩沖區讀出。這樣就非常靈活了。
串口是流資料,要用不間斷的流資料思維來處理,資料流不是一條條,而是連續不斷。協議自己定頭尾,定結構,才能很好的從流資料中取出和識別協議資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/66483.html
標籤:C#
下一篇:EF postgre磁區問題
