“串口命令字解析”测试

实验平台:STM32F103开发板

串口例程参考:战舰例程

目录

前言

测试过程

程序设计

测试代码

注意事项

测试结果

总结


前言

串口命令字解析,多用于设备测试。由生产装备(测试设备)发送命令数据帧给被测设备,被测设备接收命令数据帧并返回相应的参数。通过这些参数,我们可以得知被测设备是否有故障,也可获得被测设备的固件信息等。本测试简单设计了几种典型的命令并得到了验证,大家可根据实际情况进行修改。

测试过程

命令数据帧格式为0xAA  0x..  0x.. ··· 0x.. 0x55。生产装备(测试设备)由PC代替。通过PC端串口助手发送区域输入命令数据帧,由usart2发送给STM32,STM32解析命令字后,再由usart2把相应参数返回到PC端串口助手接收区域。若接收区域显示内容与解析部分的执行结果一致,说明命令字解析成功。

程序设计

1. 接收来自生产装备的命令数据帧,并放入接收缓冲区中
2. 如果接收到的数据帧的帧头不是0xAA,则为无效数据帧,返回“Error Command!”
3. 若帧头正确,则进行命令解析。本测试写了4条命令:

  •     若命令数据帧为 0xAA 0x26 0x55, 发一个字节数据, 串口助手接收区域显示 0x26
  •     若命令数据帧为 0xAA 0x66 0x01 0x55, 调用函数(函数参数由命令数据帧提供)并返回结果, 串口助手接收区域显示 02
  •     若命令数据帧为 0xAA 0x97 0x55, 将发送缓冲区中的数据发给PC(缓冲区中的数据可以是自定义的或程序中其他函数的返回值), 串口助手接收区域显示 AA 0E 00 55 00
  •     若命令数据帧为 0xAA 0x0A 0x55, 同上一条, 串口助手接收区域显示 AA 0E 55 00 00 (设计这一条是为了显示“清空缓冲区的必要性”)

测试代码

//接收缓冲区命令解析
while(1)
 {
	if(USART2_RX_STA&0x8000) //检查已接收完毕
	{					   
		if(USART2_RX_BUF[0]!=0xAA)
		{printf("Error command!!!\n");}//判断第一个元素不是0xAA
		else 
		{switch(USART2_RX_BUF[1]) //判断第二个元素是0x26还是0x0A
			{
               case 0x26:
				printf("0x26\n");
				break;
				
			   case 0x66:
				{
				 if(USART_GetFlagStatus(USART2, USART_FLAG_TC))//这一句可以避免第一个发送数据丢失
				 {
				  USART_SendData(USART2, plus(USART2_RX_BUF[2]));//向串口2发送数据
				  while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
				 }
				}
				break; 

			   case 0x97:
				 { 
				  Send_BUFF[0] = 0xAA;
				  Send_BUFF[1] = 0x0E;
				  Send_BUFF[2] = 0x00;
				  Send_BUFF[3] = 0x55;
				  USART2_Send_Data();
			      memset(Send_BUFF,0,sizeof(Send_BUFF));//发送缓冲区清零
				 }
				 break;
				 
			   case 0x0A:
				 {
				  Send_BUFF[0] = 0xAA;
				  Send_BUFF[1] = 0x0E;
				  Send_BUFF[2] = 0x55;       
				  USART2_Send_Data();
				  memset(Send_BUFF,0,sizeof(Send_BUFF));
				 }
				 break;

				 
			   default:
				 break;
		    }
	     }
	 USART2_RX_STA=0;//清空接收标志位
	 }
 } 

下面是附加的两个函数:

//usart2发送数组 
//发送缓冲区u8 Send_BUFF[MANUF_MAX_BUFF],缓冲区大小为5个字节
void USART2_Send_Data()
	{
	 u8 t;
	 for(t=0;t<MANUF_MAX_BUFF;t++)
	 {
	   if(USART_GetFlagStatus(USART2, USART_FLAG_TC))
	   {
		USART_SendData(USART2, Send_BUFF[t]);
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
	   }//等待发送结束
	 }
	}


//加一函数
u8 plus(u8 a)
   { 
	u8 b;
	b = a + 1;
	return b;
   }

注意事项

1. 发送发送缓冲区的数据时,发送完成后,必须清空缓冲区,否则第4条命令将会返回错误信息(AA 0E 55 55 00)。所以,每发送一次, 就要清空一次。
2. 这里清空缓冲区用的方法是调用memset(buffer, 0, sizeof(buffer)),注意使用时需加头文件string.h

测试结果

4条命令的测试结果依次如下图1-4所示

图1 AA2655
图1 AA 26 55

 

AA660155
图2 AA 66 01 55

 

AA9755
图3 AA 97 55

 

AA0A55
图4 AA 0A 55

 

显然,与所设计的结果一致。如此,便实现了串口命令字解析。

总结

文中测试代码虽然实现了命令字解析,但自认为是一种笨方法,基于我当前的水平只能写出这些。如果有更好方法,欢迎留言或私信。谢谢~

以上!

【声明】本博文为个人学习笔记,仅供参考。转发请注明出处。如发现有误,还请不吝赐教,谢谢!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值