上一篇文章分享了CVI发送数据给STM32的程序(LabwindowsCVI上位机通过串口向STM32发送数据程序分享)和STM32串口接受和发送数据的程序(USART/UART)确实已经过去很长时间了,现在才动手做接收部分属实是有些懒惰了。话不多说我们进入正题。
如果只是单纯的想接受CVI发送的数据,那其实并不困难,但是考虑到接受数据的准确性以及何时发送数据何时终止发送,我们就需要写一个简单的通讯协议(只判断帧头帧尾即可)。
除此之外,什么时候让程序运行,什么时候让程序终止也是应该考虑到的,所以我的程序如下。
if(USART_RX_STA & 0xC000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
if(len<3)
{
value1=*(USART_RX_BUF);
}
if(value1==0x31)
{
sscanf((char*)(USART_RX_BUF), "A%fA", &value); /* value为截取到的浮点数值 */
b=value;
memset(USART_RX_BUF, 0x00, USART_RX_STA & 0x3FFF);
}
else if(value1!=0x31)
{
break;
}
delay_ms(10);
在这里我用长度作为判断条件来判断CVI发送的数据是用来参与运算的还是用来开启或结束程序(因为我用来参与运算的数据长度大于三位,并且用1作为开启条件)。如果接受到1,1将会被赋给value1,则可以运行sscanf函数,当截取到帧头帧尾(我都设为A),就会把AA之间的数据读取并赋给变量b,接着用memset函数清零。如果接受到不为1的长度小于3的数据,程序则会中断。
if(UART_FLAG_PROC==1)
{
if((USART_RX_BUF[1]==0x0d&&USART_RX_BUF[2]==0x0a)||(USART_RX_BUF[2]==0x0d&&USART_RX_BUF[3]==0x0a))
{
if(USART_RX_BUF[1]==0x0d&&USART_RX_BUF[2]==0x0a)
value1=USART_RX_BUF[0]-48;
else if(USART_RX_BUF[2]==0x0d&&USART_RX_BUF[3]==0x0a)
value1=USART_RX_BUF[1]-48;
USART_RX_BUF[0]=0;
USART_RX_BUF[1]=0;
USART_RX_BUF[2]=0;
USART_RX_BUF[3]=0;
USART_RX_BUF[4]=0;
USART_RX_BUF[5]=0;
USART_RX_BUF[6]=0;
USART_RX_BUF[7]=0;
}
if(USART_RX_BUF[0]=='A'&&USART_RX_BUF[6]=='A')
{
value=(USART_RX_BUF[1]-48)*1000+(USART_RX_BUF[3]-48)*100+(USART_RX_BUF[4]-48)*10+(USART_RX_BUF[5]-48);//ASCII码转,所以减48
value=value/1000.0f;
USART_RX_BUF[0]=0;
USART_RX_BUF[1]=0;
USART_RX_BUF[2]=0;
USART_RX_BUF[3]=0;
USART_RX_BUF[4]=0;
USART_RX_BUF[5]=0;
USART_RX_BUF[6]=0;
USART_RX_BUF[7]=0;
}
UART_FLAG_PROC=0;
再提供另一种数组的方法,思路和上一种是一样的