打印
[KungFu32位 MCU]

关于串口中断接收的问题

[复制链接]
10882|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用串口中断例程的时候,发现当一个字节单独的发送的时候接收到的是正确的数据,但一次发送多个字节的时候接收到的数据是不正常的,当发送两个字节的时候会进入一次接收中断,当发送4个字节的时候会进入两次接收中断?总会有字节数据没接收到。

使用特权

评论回复
沙发
编号10086| | 2021-7-8 11:35 | 只看该作者
串口和FIFO.zip (2.8 MB)
我最近也在看这款单片机,用的官方的KF350开发板。
我移植了安富莱的一部分例程,串口FIFO,软件定时器等。

不过我只实现了串口2的,其他的我还没写。你可以参考一下。

使用特权

评论回复
板凳
编号10086| | 2021-7-8 12:23 | 只看该作者
发送字符串“1324” 的效果。
这说明应该是发送的数据都被接收到了。


使用特权

评论回复
地板
编号10086| | 2021-7-8 12:39 | 只看该作者
串口2接收到的数据被压入g_RxBuf2这个数组中。

芯旺微的IDE好像要暂停调试才能看到变量。debug模式下,数组里的值怎么实时显示我还没弄明白。

5621660e6810c6859c.png (235.37 KB )

5621660e6810c6859c.png

9884160e68114b53d3.png (235.37 KB )

9884160e68114b53d3.png

使用特权

评论回复
5
psm132132| | 2021-7-8 13:41 | 只看该作者
串口本来就是以字节为单位传输, 每进一次中断, 需要清除中断标志, 应该是你接收逻辑还需要优化,  我这边用下来暂时没发现这个问题.

使用特权

评论回复
6
伤口不结|  楼主 | 2021-7-8 15:32 | 只看该作者
编号10086 发表于 2021-7-8 12:39
串口2接收到的数据被压入g_RxBuf2这个数组中。

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

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

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

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

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


第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能一样才对,但是我用例程没有你发的程序的效果

使用特权

评论回复
7
编号10086| | 2021-7-8 16:56 | 只看该作者
伤口不结 发表于 2021-7-8 15:32
第一个代码是例程里面的串口中断接收,第二个是你发的程序的中断接收。给我的感觉是两个程序应该功能 ...

对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因?

使用特权

评论回复
8
伤口不结|  楼主 | 2021-7-8 17:04 | 只看该作者
编号10086 发表于 2021-7-8 16:56
对啊,应该是一样的,你的程序是怎么写的?是不是没有做缓存之类的原因? ...
        if(USART_Get_Receive_BUFR_Ready_Flag(USART2_SFR))
        {
                Receive_temp=USART_ReceiveData(USART2_SFR));
                if(Receive_flag!=1)
                {                       
                                        if(Receive_cnt1==0)
                                        {
                                                if(Receive_temp=='A')
                                                {
                                                        Receive_buff[Receive_cnt1]=Receive_temp;
                                                        Receive_cnt1++;
                                                }
                                        }
                                   else if(Receive_cnt1==1)
                                        {
                                                if(Receive_temp=='T')
                                                {
                                                        Receive_buff[Receive_cnt1]=Receive_temp;
                                                        Receive_cnt1++;
                                                        Receive_flag=1;
                                                }
                                        }
          }       
        }


遇到A和T就存起来的,但是我试过没有达到效果

使用特权

评论回复
9
伤口不结|  楼主 | 2021-7-8 17:05 | 只看该作者
伤口不结 发表于 2021-7-8 17:04
遇到A和T就存起来的,但是我试过没有达到效果

只有分两次发送A和T效果才正确,直接发AT只接收到了A

使用特权

评论回复
10
coody| | 2021-7-8 17:55 | 只看该作者
串口都是发完一个自己,再发下一个。

使用特权

评论回复
11
huquanz711| | 2021-7-8 19:45 | 只看该作者
这种情况一般是串口中断函数没处理好,写个buffer来装数据。

使用特权

评论回复
12
besovideo| | 2021-7-8 20:54 | 只看该作者
封装一个保证性能和稳定可靠性的串口通信的API,是一个上位机或嵌入式软件里面的一个重要部件。

使用特权

评论回复
13
rainmon| | 2021-8-19 13:49 | 只看该作者
mark

使用特权

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

本版积分规则

5

主题

15

帖子

0

粉丝