[KungFu32位 MCU] 关于串口中断接收的问题

[复制链接]
11236|12
 楼主| 伤口不结 发表于 2021-7-8 09:05 | 显示全部楼层 |阅读模式
使用串口中断例程的时候,发现当一个字节单独的发送的时候接收到的是正确的数据,但一次发送多个字节的时候接收到的数据是不正常的,当发送两个字节的时候会进入一次接收中断,当发送4个字节的时候会进入两次接收中断?总会有字节数据没接收到。
编号10086 发表于 2021-7-8 11:35 | 显示全部楼层
串口和FIFO.zip (2.8 MB, 下载次数: 9)
我最近也在看这款单片机,用的官方的KF350开发板。
我移植了安富莱的一部分例程,串口FIFO,软件定时器等。

不过我只实现了串口2的,其他的我还没写。你可以参考一下。
编号10086 发表于 2021-7-8 12:23 | 显示全部楼层
发送字符串“1324” 的效果。
这说明应该是发送的数据都被接收到了。

6053260e67d99bb9e3.png
编号10086 发表于 2021-7-8 12:39 | 显示全部楼层
串口2接收到的数据被压入g_RxBuf2这个数组中。

芯旺微的IDE好像要暂停调试才能看到变量。debug模式下,数组里的值怎么实时显示我还没弄明白。
5621660e6810c6859c.png
9884160e68114b53d3.png
psm132132 发表于 2021-7-8 13:41 | 显示全部楼层
串口本来就是以字节为单位传输, 每进一次中断, 需要清除中断标志, 应该是你接收逻辑还需要优化,  我这边用下来暂时没发现这个问题.
 楼主| 伤口不结 发表于 2021-7-8 15:32 | 显示全部楼层
编号10086 发表于 2021-7-8 12:39
串口2接收到的数据被压入g_RxBuf2这个数组中。

芯旺微的IDE好像要暂停调试才能看到变量。debug模式下,数 ...
  1. if(USART_Get_Receive_BUFR_Ready_Flag(USART2_SFR))
  2.         {
  3.                 Receive_buff=USART_ReceiveData(USART2_SFR));
  4.         }

  1. uint32_t strflags   = _pUart->uart->STR;//str寄存器(串口状态)
  2.         uint32_t ierflags   = _pUart->uart->IER;//ier寄存器(串口中断使能)

  3.         if ((strflags & USART_STR_RDRIF) != RESET)//串口接收中断RDRIF
  4.         {
  5.                 /* 从串口接收数据寄存器读取数据存放到接收FIFO */

  6.                 /*1.从RBUFR寄存器中读取接收到数据ch(注:从RBUFR读取数据会自动把接收中断标志RDRIF清零)*/
  7.                 uint8_t ch;
  8.                 ch = _pUart->uart->RBUFR;

  9.                 /*2.把ch放入接收缓冲区*/
  10.                 _pUart->pRxBuf[_pUart->usRxWrite] = ch;


第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能一样才对,但是我用例程没有你发的程序的效果
编号10086 发表于 2021-7-8 16:56 | 显示全部楼层
伤口不结 发表于 2021-7-8 15:32
第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能 ...

对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因?
 楼主| 伤口不结 发表于 2021-7-8 17:04 | 显示全部楼层
编号10086 发表于 2021-7-8 16:56
对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因? ...
  1.         if(USART_Get_Receive_BUFR_Ready_Flag(USART2_SFR))
  2.         {
  3.                 Receive_temp=USART_ReceiveData(USART2_SFR));
  4.                 if(Receive_flag!=1)
  5.                 {                       
  6.                                         if(Receive_cnt1==0)
  7.                                         {
  8.                                                 if(Receive_temp=='A')
  9.                                                 {
  10.                                                         Receive_buff[Receive_cnt1]=Receive_temp;
  11.                                                         Receive_cnt1++;
  12.                                                 }
  13.                                         }
  14.                                    else if(Receive_cnt1==1)
  15.                                         {
  16.                                                 if(Receive_temp=='T')
  17.                                                 {
  18.                                                         Receive_buff[Receive_cnt1]=Receive_temp;
  19.                                                         Receive_cnt1++;
  20.                                                         Receive_flag=1;
  21.                                                 }
  22.                                         }
  23.           }       
  24.         }


遇到A和T就存起来的,但是我试过没有达到效果
 楼主| 伤口不结 发表于 2021-7-8 17:05 | 显示全部楼层
伤口不结 发表于 2021-7-8 17:04
遇到A和T就存起来的,但是我试过没有达到效果

只有分两次发送A和T效果才正确,直接发AT只接收到了A
coody 发表于 2021-7-8 17:55 | 显示全部楼层
串口都是发完一个自己,再发下一个。
huquanz711 发表于 2021-7-8 19:45 来自手机 | 显示全部楼层
这种情况一般是串口中断函数没处理好,写个buffer来装数据。
besovideo 发表于 2021-7-8 20:54 | 显示全部楼层
封装一个保证性能和稳定可靠性的串口通信的API,是一个上位机或嵌入式软件里面的一个重要部件。
rainmon 发表于 2021-8-19 13:49 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部