串列埠資料接收的常用處理方式

2021-10-02 11:48:15 字數 1193 閱讀 8714

串列埠資料接收的常用方式有三種:

使用狀態機機制

通過判斷結束字元的方式

通過資料接收超時的方式

使用狀態機機制,這種方式常用於接收16進製制資料的情況,比較典型的例子是modbus-rtu資料的接收。這種方式能夠及時的處理接收到的資料,但是寫程式太繁瑣,而且通用性差,不同的協議狀態機就不一樣。使用狀態機機制接收資料,可以參考libmodbus的**。

通過判斷結束字元的方式,這種機制常用於接收字元型資料的情況,典型的例子有:at指令的接收,網路資料的接收等。通過判斷\r\n來確定一幀資料。這種方式通常不用於16進製制資料的接收,因為無論選擇什麼數作為結束字元,都有可能出現在資料域中。

通過資料接收超時的方式,這種方式通過接收乙個資料之後若干時間沒有再接收到新的資料,就認為這一幀的資料接收完成。這種方式最簡單,但是有個弊端,就是不能對接收到的資料進行及時的處理,而且不能處理資料幀連續傳送的情況,這種情況很容易造成緩衝區的溢位。

總結一下,如果是接收16進製制資料組成的資料幀,通常使用狀態機的方式。使用字元組成的資料幀,通常通過"判斷結束字元"完成一幀資料的接收。但是要注意,**無論是使用狀態機機制還是"判斷結束字元"的方式,都要進行超時判斷。**這是因為當使用狀態機機制接收到錯誤資料時,會進入錯誤的狀態,這就有可能永遠無法恢復到正常狀態。這時可以通過接收超時的方式,將狀態機的狀態重置。判斷結束字元的情況也一樣,在接收出錯的時候可以通過接收超時的方式,對錯誤進行處理。當追求簡單的時候可以只使用"資料接收超時"的方式對資料進行處理,但是要注意這種方式的侷限性。

libmodbus的github庫

其中接收函式是modbus.c中的函式int _modbus_receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type)

esp8266的at指令處理github庫

其中接收函式是at_port.c中的函式static void icache_flash_attr at_recvtask(os_event_t *events)

我寫的通過資料接收超時的方式的github庫

資料傾斜通用處理方式

hive mr spark 以mr為例,目前有p1 和 p2 兩個分割槽,p1分區內有1億條資料,key值為a p2分區內有一萬條資料,key值為b 以sql為例首先,為key加上隨機數,進行一次分割槽,select 聚合函式,如count from group by key 隨機數 t1 然後在上...

ssh專案異常用處理方式

在struts2中封裝了自己的異常處理方式。我們在專案中可以根據自己的需要來處理自己的異常。可以建乙個異常資訊封裝類,將專案中常見異常資訊進行封裝,常見資訊包括 1.異常種類 如 資料庫操作異常 應用操作異常 業務異常,如 許可權不夠等 系統異常 如 應用伺服器異常 2.具體異常 如 該資料庫不存在...

ssh專案異常用處理方式

在struts2中封裝了自己的異常處理方式。我們在專案中可以根據自己的需要來處理自己的異常。可以建乙個異常資訊封裝類,將專案中常見異常資訊進行封裝,常見資訊包括 1.異常種類 如 資料庫操作異常 應用操作異常 業務異常,如 許可權不夠等 系統異常 如 應用伺服器異常 2.具體異常 如 該資料庫不存在...