1. 程式人生 > >c++串列埠上位機協議包封裝

c++串列埠上位機協議包封裝

上一篇說到串列埠協議的封包與拆包,主要要是應用於微控制器與微控制器通訊,或者與上位機程式通訊,這裡我是與上位機程式通訊。

思路:

因為此功能是用c語言寫的,所有在微控制器上可以使用,在pc機上也是可以使用的。

這是微控制器主函式程式碼:

 int main(void)
 {	

	delay_init();	    	 //延時函式初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設定中斷優先順序分組2
	uart_init(115200);	 //串列埠初始化為9600
	LED_Init();		  	 //初始化與LED連線的硬體介面 
 wifi_buff_init();
	 printf("ok ing...\r\n");
	 
	 
	while(1)
	{
			
			analyze_queue();		//處理資料
		
			set_tx_data("hello",5);	//傳送hello過去,這裡面是對此資料封過包的
		
			delay_ms(100);
	}
}

這裡是上位機程式程式碼邏輯,程式碼涉及過多,都是以前寫過的類,這裡就不重複貼了。

首先呼叫初始化函式wifi_buff_init();

用一個執行緒去讀取串列埠資料,呼叫add_message_queue(ch);函式把資料加入佇列。

//接收資料
DWORD WINAPI Thread_fun1(LPVOID pM)  
{
	 char ch;
	while(1)
	{

		COM.Read_Byte(ch);				//從串列埠讀取資料,此功能是以前封裝的
		TRAN.add_message_queue(ch);		//把資料加入到佇列,只是把wifi_data_tran.c檔案改成wifi_data_tran.cpp
	
	}

}

另一個執行緒負責解析資料,呼叫analyze_queue();解析資料

//處理資料
DWORD WINAPI Thread_fun2(LPVOID pM)  
{
	
	while(1)
	{
		TRAN.analyze_queue();
		
	}

}

因為時間問題,上位機就沒有做成MFC了,這裡用控制檯代替

看看資料解析效果


recv:0:48 45 53 5a 4a 7 0 0 5 0 0 0 68 65 6c 6c 6f

這一段資料就是解析出來的包,包有任何錯誤不都會解析出來的,從程式列印來看,驗證了4個包頭,長度,資料長度,校驗。