毕业设计需要用到STM32串口通讯部分,我根据例子写出了一个STM32串口通讯的小程序,目标是发送0xcc,0xdd,1,2,3,4,5,6,0xee这样的数据给到STM32中,其中0xcc和0xdd是帧头,0xee是帧尾,目前问题为用串口助手XCOM一次性发送这九个数据时,STM32只能收到两个数据,即0xcc和0xdd。用串口助手单个数据一个一个发送发送经过测试没有问题,请问我该调整哪个部分? 代码如下, void USART1_IRQHandler(void) { extern unsigned char openmv[]; unsigned char temp; if( USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET ) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); temp = USART_ReceiveData(USART1); Openmv_Receive_Data(temp);//解包函数 } } void Openmv_Receive_Data(unsigned char data)//发送数据0xCC,0xDD,x,y,z,a,b,c,0XEE { extern unsigned char openmv[9]; static char state = 0; static char bit_number=0; if(state==0&&data==0xCC) { state=1; openmv[bit_number++]=data; } else if(state==1&&data==0xDD) { state=2; openmv[bit_number++]=data; } else if(state==2) { openmv[bit_number++]=data; if(bit_number>=8) { state=3; } } else if(state==3) { if(data == 0xEE) { state = 0; openmv[bit_number++]=data; bit_number = 0; } else if(data != 0xEE) { state = 0; bit_number = 0; for(int i=0;i<9;i++) { openmv[i]=0x00; } } } else { state = 0; bit_number=0; for(int i=0;i<9;i++) { openmv[i]=0x00; } } } |
不能放在中断接收中去,只能在主循环中。
评分
查看全部评分
if(state==0&&data==0xcc)有一个运算优先等级问题,应该写成:
if((state==0)&&(data==0xcc))
评分
查看全部评分
评分
查看全部评分
我查了一下,==的优先级是在&&之前的,应该不是这里的问题
数组自增变量应该是全局变量 局部变量 每次调一次函数都会清零一次 导致数组的数据不能增加
状态变量也是 每次调用函数都清零了 上次的置位没有意义了 程序走不下去
再说要接几个数据 也不用搞这么复杂的 就在中断里用if判断就可以接 判断头尾 就可以了
置一个接收完成标志 初始清零
接收到第一个字符存在数组0里面 后续就判断数组0的状态
接收到的数据不是尾的时候 数据依次存入数组
接收到尾之后 接收标志置位
所有的变量都用全局变量 局部变量只做缓存
评分
查看全部评分
解包函数放在主循环中,或者是在Idle中断时做处理,而且这里面没有看到你如何做缓存的工作。
评分
查看全部评分
评分
查看全部评分