stm32f030串口接收到数组如何处理。
本帖最后由 呐咯密密 于 2021-12-7 10:22 编辑stm32f030串口接收到八个字节数组,我想提取这个数组的第4位和第5位来进行运算后转为十进制数,但是提取数据的时候出问题了,本人刚入门小白,求大佬指点下面是我中断的代码:
char RxCounter2=0,RxBuffer2;
int DF1;//传感器第4位数据
int DF2;//传感器第5位数据
int DF;
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
RxBuffer2 = USART_ReceiveData(USART2);
DF1 = RxBuffer2;
DF2 = RxBuffer2;
DF = (DF1*256 + DF2) / (100);// USART_SendData(USART1,USART_ReceiveData(USART2)); //输出第一行,这是我传感器发送的数据格式,是8个字节,十六进制数//
USART_SendData(USART1,RxBuffer2); //输出第二行,我想要的是提起第一位,一个字节,但是又显示的是一个8个字节的数组//
USART_SendData(USART1,RxBuffer2); //输出第三行,这个是从第二位还是写入,第一位是0,但是还是数组 USART_SendData(USART1,RxBuffer2); //输出第四行,同上,类推 }
while (USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET); }运行结果如下:RX:16 05 01 00 00 00 AC 38 // USART_SendData(USART1,USART_ReceiveData(USART2))输出结果RX:16 16 16 16 16 16 16 16 // USART_SendData(USART1,RxBuffer2)输出结果RX:00 05 05 05 05 05 05 05 // USART_SendData(USART1,RxBuffer2)输出结果
RX:00 00 01 01 01 01 01 01 // USART_SendData(USART1,RxBuffer2)输出结果我尝试过的方法:我将RxBuffer2定义为全局变量以后,在main.c里面执行USART_SendData(USART1,RxBuffer2);后输出变成一个字节了,但是读取不出RxBuffer2内的数,输出都是0RX:00我想要的结果是:执行USART_SendData(USART1,RxBuffer2);得到RX: 16执行USART_SendData(USART1,RxBuffer2);得到RX: 05以此类推,请大佬帮忙解答,十分感谢
看看是不是USART_SendData这个函数内容有问题
建议您将接收和处理的代码分开,不要在接收的过程中就处理,这样有可能会影响到正常接收,要等接收完成之后再来处理。 如同楼上说的,发送接收中断的逻辑比较乱,与官方或者大众的顺序不同。 在接收到数据的中断里去发送数据,并没有判读发送的状态,而且还在这个接收中断服务程序中来等发送寄存器为空的状态。
建议参考官方或经典的串口通讯程序逻辑,发送是发送的逻辑,接收是接收的逻辑,然后再外面处理相关数据,不要混合在其中一个中断里。 我给你的代码整理了一下,下次发帖记得用代码工具,这样发表出来的帖子不会有格式问题,然后下面是我给你的修改方法:void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{ /*关闭中断,继续接收后面的数据*/
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
for(uint8_t i=0;i<8;i++)//用for循环将USART的数据接收完整,此处可以使用IDLE中断最合适
{
RxBuffer2 = USART_ReceiveData(USART2);
}
DF1 = RxBuffer2;//数据第四个存入DF1
DF2 = RxBuffer2; //数据第五个存入DF2
DF = (DF1*256 + DF2) / (100);// USART_SendData(USART1,USART_ReceiveData(USART2)); //输出第一行,这是我传感器发送的数据格式,是8个字节,十六进制数//
/*此时打印的结果应该不会有问题了*/
USART_SendData(USART1,RxBuffer2); //输出第二行,我想要的是提起第一位,一个字节,但是又显示的是一个8个字节的数组//
USART_SendData(USART1,RxBuffer2); //输出第三行,这个是从第二位还是写入,第一位是0,但是还是数组
USART_SendData(USART1,RxBuffer2); //输出第四行,同上,类推 }
while (USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
}
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
问题所在:你的中断函数函数内的数据接收存在问题,在第一个数据触发中断后关闭接收中断,循环接收数据就好了,你的写法一组数据会触发8次中断,所以你的串口助手会收到8个数据
最佳方法:使用IDLE空闲中断,只在8个数据接收完整后才触发。
这种中断接收数据的用循环队列最简单 一般接收放在中断中处理 来一个数据保存一个,数量够了就处理 楼主想要达到什么目的呢 一般接收的时候就只接读取了 中断里边直接进行读取 可以攒着一起读取吗 感觉应该是可以的 但是要把握好这个度 可以自己定义处理方式 麻花油条 发表于 2021-12-7 10:21
如同楼上说的,发送接收中断的逻辑比较乱,与官方或者大众的顺序不同。 在接收到数据的中断里去发送数据, ...
是的,很赞同,接收、处理、执行,分开来
页:
[1]