打印
[应用相关]

stm32f030串口接收到数组如何处理。

[复制链接]
1616|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
classroom|  楼主 | 2021-12-7 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 呐咯密密 于 2021-12-7 10:22 编辑

stm32f030串口接收到八个字节数组,我想提取这个数组的第4位和第5位来进行运算后转为十进制数,但是提取数据的时候出问题了,本人刚入门小白,求大佬指点
下面是我中断的代码:


char RxCounter2=0,RxBuffer2[100];
int DF1;  //传感器第4位数据
int DF2;  //传感器第5位数据
int DF;
void USART2_IRQHandler(void)
{        
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)     
   {              
  RxBuffer2[RxCounter2++] = USART_ReceiveData(USART2);   
      DF1 = RxBuffer2[3];         
      DF2 = RxBuffer2[4];           
     DF = (DF1*256 + DF2) / (100);//             USART_SendData(USART1,USART_ReceiveData(USART2));   //输出第一行,这是我传感器发送的数据格式,是8个字节,十六进制数//               
USART_SendData(USART1,RxBuffer2[0]);     //输出第二行,我想要的是提起第一位,一个字节,但是又显示的是一个8个字节的数组//               
USART_SendData(USART1,RxBuffer2[1]);     //输出第三行,这个是从第二位还是写入,第一位是0,但是还是数组                USART_SendData(USART1,RxBuffer2[2]);       //输出第四行,同上,类推                             }         
while (USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);                     }
运行结果如下:
[2021-12-03 11:00:58.945]RX:16 05 01 00 00 00 AC 38         // USART_SendData(USART1,USART_ReceiveData(USART2))输出结果[2021-12-03 11:01:33.039]RX:16 16 16 16 16 16 16 16         // USART_SendData(USART1,RxBuffer2[0])输出结果[2021-12-03 11:01:51.041]RX:00 05 05 05 05 05 05 05         // USART_SendData(USART1,RxBuffer2[1])输出结果
[2021-12-03 11:02:10.052]RX:00 00 01 01 01 01 01 01         // USART_SendData(USART1,RxBuffer2[2])输出结果
我尝试过的方法:
我将RxBuffer2定义为全局变量以后,在main.c里面执行
USART_SendData(USART1,RxBuffer2[1]);
后输出变成一个字节了,但是读取不出RxBuffer2内的数,输出都是0
[2021-12-03 12:03:11.052]RX:00
我想要的结果是:
执行
USART_SendData(USART1,RxBuffer2[0]);
得到
RX: 16
执行
USART_SendData(USART1,RxBuffer2[1]);
得到
RX: 05
以此类推,请大佬帮忙解答,十分感谢



使用特权

评论回复
沙发
onlycook| | 2021-12-7 10:14 | 只看该作者
看看是不是USART_SendData这个函数内容有问题

使用特权

评论回复
板凳
内政奇才| | 2021-12-7 10:18 | 只看该作者

建议您将接收和处理的代码分开,不要在接收的过程中就处理,这样有可能会影响到正常接收,要等接收完成之后再来处理。

使用特权

评论回复
地板
麻花油条| | 2021-12-7 10:21 | 只看该作者
如同楼上说的,发送接收中断的逻辑比较乱,与官方或者大众的顺序不同。 在接收到数据的中断里去发送数据,并没有判读发送的状态,而且还在这个接收中断服务程序中来等发送寄存器为空的状态。
建议参考官方或经典的串口通讯程序逻辑,发送是发送的逻辑,接收是接收的逻辑,然后再外面处理相关数据,不要混合在其中一个中断里。

使用特权

评论回复
5
呐咯密密| | 2021-12-7 10:40 | 只看该作者
我给你的代码整理了一下,下次发帖记得用代码工具,这样发表出来的帖子不会有格式问题,然后下面是我给你的修改方法:
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[i] = USART_ReceiveData(USART2);  
                }
                DF1 = RxBuffer2[3];//数据第四个存入DF1         
                DF2 = RxBuffer2[4]; //数据第五个存入DF2           
                DF = (DF1*256 + DF2) / (100);// USART_SendData(USART1,USART_ReceiveData(USART2));   //输出第一行,这是我传感器发送的数据格式,是8个字节,十六进制数//               
                /*此时打印的结果应该不会有问题了*/
                USART_SendData(USART1,RxBuffer2[0]);     //输出第二行,我想要的是提起第一位,一个字节,但是又显示的是一个8个字节的数组//               
                 USART_SendData(USART1,RxBuffer2[1]);     //输出第三行,这个是从第二位还是写入,第一位是0,但是还是数组               
                USART_SendData(USART1,RxBuffer2[2]);       //输出第四行,同上,类推                             }         
                 while (USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
        }
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}

问题所在:你的中断函数函数内的数据接收存在问题,在第一个数据触发中断后关闭接收中断,循环接收数据就好了,你的写法一组数据会触发8次中断,所以你的串口助手会收到8个数据

最佳方法:使用IDLE空闲中断,只在8个数据接收完整后才触发。

使用特权

评论回复
6
海洋无限| | 2021-12-7 12:10 | 只看该作者
这种中断接收数据的用循环队列最简单

使用特权

评论回复
7
laocuo1142| | 2021-12-7 13:15 | 只看该作者
一般接收放在中断中处理

使用特权

评论回复
8
ningling_21| | 2021-12-7 14:20 | 只看该作者
来一个数据保存一个,数量够了就处理

使用特权

评论回复
9
tpgf| | 2022-1-3 19:57 | 只看该作者
楼主想要达到什么目的呢

使用特权

评论回复
10
guanjiaer| | 2022-1-3 20:03 | 只看该作者
一般接收的时候就只接读取了

使用特权

评论回复
11
heimaojingzhang| | 2022-1-3 20:07 | 只看该作者
中断里边直接进行读取

使用特权

评论回复
12
keaibukelian| | 2022-1-3 20:09 | 只看该作者
可以攒着一起读取吗

使用特权

评论回复
13
labasi| | 2022-1-3 20:12 | 只看该作者
感觉应该是可以的 但是要把握好这个度

使用特权

评论回复
14
paotangsan| | 2022-1-3 20:14 | 只看该作者
可以自己定义处理方式

使用特权

评论回复
15
122541325| | 2022-1-4 15:53 | 只看该作者
麻花油条 发表于 2021-12-7 10:21
如同楼上说的,发送接收中断的逻辑比较乱,与官方或者大众的顺序不同。 在接收到数据的中断里去发送数据, ...

是的,很赞同,接收、处理、执行,分开来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

418

主题

2030

帖子

1

粉丝