匿名上位机使用方法分享--高级收码

时间:2024-04-04 15:19:36

匿名上位机总体介绍移步:https://blog.csdn.net/wangjt1988/article/details/83684188

高级收码,也就是带协议解析的数据接收功能,可以将收到的数据,按匿名通信协议进行解析。下面请看本功能截图:

区域介绍:

匿名上位机使用方法分享--高级收码

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校验值。

同时D区域也开始实时显示数据1、2、3的实时值,表示数据已成功接收、解析。