STM32串口接收问题
毕业设计需要用到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;
static char state = 0;
static char bit_number=0;
if(state==0&&data==0xCC)
{
state=1;
openmv=data;
}
else if(state==1&&data==0xDD)
{
state=2;
openmv=data;
}
else if(state==2)
{
openmv=data;
if(bit_number>=8)
{
state=3;
}
}
else if(state==3)
{
if(data == 0xEE)
{
state = 0;
openmv=data;
bit_number = 0;
}
else if(data != 0xEE)
{
state = 0;
bit_number = 0;
for(int i=0;i<9;i++)
{
openmv=0x00;
}
}
}
else
{
state = 0;
bit_number=0;
for(int i=0;i<9;i++)
{
openmv=0x00;
}
}
}
Openmv_Receive_Data(temp);//解包函数
不能放在中断接收中去,只能在主循环中。 那个
if(state==0&&data==0xcc)有一个运算优先等级问题,应该写成:
if((state==0)&&(data==0xcc)) 接收处理函数应该放在主函数,大循环中,中断里边做的事比较多,中断应该尽量的短,可以在中断里将数据全部接收完成之后再进行业务判断处理 wenyangzeng 发表于 2020-4-19 07:24
那个
if(state==0&&data==0xcc)有一个运算优先等级问题,应该写成:
if((state==0)&&(data==0xcc)) ...
我查了一下,==的优先级是在&&之前的,应该不是这里的问题 逻辑有问题
数组自增变量应该是全局变量局部变量 每次调一次函数都会清零一次导致数组的数据不能增加
状态变量也是每次调用函数都清零了上次的置位没有意义了程序走不下去
再说要接几个数据也不用搞这么复杂的就在中断里用if判断就可以接判断头尾就可以了
置一个接收完成标志初始清零
接收到第一个字符存在数组0里面后续就判断数组0的状态
接收到的数据不是尾的时候数据依次存入数组
接收到尾之后接收标志置位
所有的变量都用全局变量局部变量只做缓存 IRQHandler中只做最基本的接收原始字节流的工作,放到一个缓冲区中。
解包函数放在主循环中,或者是在Idle中断时做处理,而且这里面没有看到你如何做缓存的工作。 中断里处理串口也费不了多少时延 做一个数组,把要发的数放到数组中,串口里写一个发送字符串函数整体发送
页:
[1]