1. 程式人生 > >匿名上位機使用方法分享--高階收碼

匿名上位機使用方法分享--高階收碼

高階收碼,也就是帶協議解析的資料接收功能,可以將收到的資料,按匿名通訊協議進行解析。下面請看本功能截圖:

區域介紹:

A:解析後資料幀顯示,第一列AA05AFF105,5位元組,第二列88XX,2位元組,第三列0C一位元組,第四列FF85,2位元組,第五列1位元組。具體每一列的解釋,稍後見下文。

B:資料幀格式設定,本區域,有1到10共10個選項卡,分別代表功能幀F1到FA的資料格式配置,比如上圖為第一頁,也就是F1的設定。使能該幀,勾選則上位機對該幀進行解析,不勾選則即使收到本F1資料幀,也不進行解析。顯示該幀,勾選後如果收到F1資料幀,則在A區域進行顯示,反之不顯示。功能碼,也就是本幀對應的F1。右方有5*6共30個選擇項,表示本資料幀,最多包含有30個數據,在這裡依次配置每個資料的資料格式,可以配置為int8,uint8,int16,uint16,int32型資料。這裡特意沒有做float型資料,float型資料有出錯概率,而且小數型float資料可以通過乘以100或者1000等,變成int16或int32整型資料進行傳輸。設定完畢後,點選儲存設定按鈕以使設定生效。

C:資料容器設定,什麼是資料容器呢,就是剛才F1資料幀進行解析後,會解析出最多30個數據,那麼用哪個資料進行波形顯示,或者excel儲存哪個資料呢,這就要資料容器了。匿名上位機設定有20個數據容器,對應本區域1到20選項卡。我們可以把資料容器想象成20個卡車,只有卡車能將資料傳輸到使用者,那麼這20輛卡車將哪個資料傳輸給使用者呢,就是這C區域進行配置了。首先選擇資料來源,幀1到幀10,對應F1到FA資料幀,然後是資料位置,有1到30共30個選項,分別對應資料幀內包含的30個數據。

D:這裡是資料實時顯示區,這裡會實時顯示20個數據容器的資料值。

舉例說明:

例如我們想傳輸3個自己的資料到上位機進行顯示,第一個為uint16型,第二個為uint8型,第三個為int16型。

第一步:我們可以用F1到FA任意一個使用者自定義資料幀,我們以F1為例。B區域選第一頁,也就是F1,然後勾選使能該幀,顯示該幀,然後右方依次選擇我們需要的3個數據型別,分別為uint16,uint8,int16,如上圖。其餘後續的資料型別選擇不比更該,任意值都可以,我們只需確定前3個選項正確就可以。最後點選儲存設定。

第二步:對資料容器進行配置,資料容器1設定為:資料來源:幀1,資料位置:1,資料容器2設定為:資料來源:幀1,資料位置:2,資料容器3設定為:資料來源:幀1,資料位置:3.那麼此時,資料容器1、2、3就分別存放了我們需要的3個數據。此時上位機就配置好了。

下面我們看看下位機的編寫。

//資料拆分巨集定義,在傳送大於1位元組的資料型別時,比如int16、float等,需要把資料拆分成單獨位元組進行傳送
#define BYTE0(dwTemp)       ( *( (char *)(&dwTemp)	  ) )
#define BYTE1(dwTemp)       ( *( (char *)(&dwTemp) + 1) )
#define BYTE2(dwTemp)       ( *( (char *)(&dwTemp) + 2) )
#define BYTE3(dwTemp)       ( *( (char *)(&dwTemp) + 3) )
	
u8 testdatatosend[50];	//傳送資料快取
void TestSendData(u8 *dataToSend , u8 length)//資料傳送函式
{
	Usb_Hid_Adddata(testdatatosend,length);	//將資料新增至HID傳送緩衝區,HID會自動傳送
}
void Test_Send_User(u16 data1, u8 data2, s16 data3)	//傳送使用者資料,這裡有3個數據,分別對應本教程3個數據
{
	u8 _cnt=0;
	
	testdatatosend[_cnt++]=0xAA;//0xAA為幀頭
	testdatatosend[_cnt++]=0x05;//0x05為資料傳送源,具體請參考匿名協議,本位元組使用者可以隨意更改
	testdatatosend[_cnt++]=0xAF;//0xAF為資料目的地,AF表示上位機,具體請參考匿名協議
	testdatatosend[_cnt++]=0xF1;//0xF1,表示本幀為F1使用者自定義幀,對應高階收碼的F1功能幀
	testdatatosend[_cnt++]=0;//本位元組表示資料長度,這裡先=0,函式最後再賦值,這樣就不用人工計算長度了

	testdatatosend[_cnt++]=BYTE1(data1);//將要傳送的資料放至傳送緩衝區
	testdatatosend[_cnt++]=BYTE0(data1);
	
	testdatatosend[_cnt++]=data2;
	
	testdatatosend[_cnt++]=BYTE1(data3);
	testdatatosend[_cnt++]=BYTE0(data3);

	testdatatosend[4] = _cnt-5;//_cnt用來計算資料長度,減5為減去幀開頭5個非資料位元組
	
	u8 sum = 0;	//以下為計算sum校驗位元組,從0xAA也就是首位元組,一直到sum位元組前一位元組
	for(u8 i=0;i<_cnt;i++)
		sum += testdatatosend[i];
	
	testdatatosend[_cnt++]=sum;	//將sum校驗資料放置最後一位元組

	TestSendData(testdatatosend, _cnt);	//呼叫傳送資料函式
}




static void Loop_1000Hz(void)//1ms執行一次
{
	static u16 cnt = 0;
	cnt++;
	Test_Send_User(cnt,12,-123);//傳送使用者資料
	Usb_Hid_Send();	//因為本例使用HID方式,此處是啟用HID資料傳送
}

可以看到,如果僅僅是使用上位機的使用者資料顯示,程式碼是十分簡單的。Test_Send_User(cnt,12,-123);函式即可將3個使用者資料傳送至上位機,本函式3個變數,為了演示,第一個變數每1ms自動加1,第2、3個變數直接用了常數。下面我們回到第一個截圖,再進行理解就很方便了。

A區域的AA05AFF105,5位元組,依次為幀頭AA、資料傳送源05、資料目的地AF、資料功能字F1、資料長度05(uint16+uint8+int16=5位元組)。然後第2、3、4列分別為3個數據,第5列為sum校驗值。