打印
[PIC®/AVR®/dsPIC®产品]

【Curiosity Nano测评报告】串口接收的实验及疑惑

[复制链接]
1150|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hu9jj|  楼主 | 2024-9-24 16:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hu9jj 于 2024-9-24 16:29 编辑

#申请原创#

    上次在LED闪烁测试中就测试了串口通讯利用printf命令发送数据的功能,测试过程非常顺利。最近几天就一直在测试串口通讯的接收功能,MCC中串口的配置如下:

    串口接收启用了中断方式,缓存区设置为16个字节。开始还添加了UART Example,生成代码后却找不到相应的示例,所以后来就删除了。

    设置串口接收中断的优先级别为最高,以免被其它中断影响到接收过程。
    生成代码后,由于找不到示例,就只好查找相应的中断函数,在eusart1.c文件中找到EUSART1_ReceiveISR()函数,这个明显就是中断接收处理函数。

    其中的eusart1RxBuffer[]就应该是接收数据的缓存区,eusart1RxCount应该是接收到的数据长度。我在主循环中想通过eusart1RxCount>0来判断串口是否接收到数据,当其大于0时则读出eusart1RxBuffer数组中的内容,结果却不能如愿。后来就在这里添加了自己定义的缓存数组进行测试,如上图红色箭头所指的行。测试中多数也接收不到数据,偶尔接收到数据时,前面几个字符正确,后面的字符就不正确了。

    如上图,我将日期时间按照YYYYMMDDhhmmcc字符串的格式发送到单片机,首个字母为‘D',单片机按接收到的数据转换后,前面的年月是正确的,后面的日时分数据却是错误的。

    仔细查看MCC配置界面,看到其中明确标示了各种波特率下的误差百分比,波特率越低误差就越小。9600波特率时误差为0.04%,1200波特率时误差为0.001%(详见上图)。我就有点不明白,我只传输了不到16个字节,在百分之零点零几的误差率下,怎么就会出现数据传输错误了呢?
    为了解决时而能接收数据、时而不能接收数据的问题,我在代码中每次接收到数据之后就对串口重新初始化,就可以每次都接收到数据了(如下图),应该是接收到数据之后没有将某个标志位复位吧。


    本次实验暂告一段落,希望厂家的工程师及有经验的坛友提供更简单明了的示例代码。


使用特权

评论回复
沙发
xuanhuanzi| | 2024-9-24 22:16 | 只看该作者
貌似PIC的单片机没提供每个外设的实例。ARM单片机厂家会把每一个外设都做几个实例的,不同的用法,希望PIC借鉴一下。

使用特权

评论回复
板凳
hu9jj|  楼主 | 2024-10-2 12:52 | 只看该作者
    经过反复测试,注释掉MCC生成的Rx数据缓存代码,用自己设置的缓存数组来接收串口收到的数据,就可以正常接收了:

    将EUSART1_ReceiveISR(void)函数中的以下三行代码注释掉,使用自己定义的数组变量:
    if (tempRxHead == eusart1RxTail)
    {
        // ERROR! Receive buffer overflow
    }
    else
    {
    //    eusart1RxBuffer[eusart1RxHead] = regValue;    //注释掉的三行代码
    //    eusart1RxHead = tempRxHead;
    //    eusart1RxCount++;
        Rx_Buff[Rx_Count++]=regValue;                       //自己定义的数组变量
    }   


    在接收到串口数据之后就不需要重复进行初始化操作。
    若换成在接收数据之后将变量eusart1RxCount清零也照旧只能接收一次,需要重复进行串口初始化。
    现在还存在的问题就是首个字节数据接收不到。如上图,发送的是“D20241001105900”,而接收到的数据缺少第一个字节'D'。

使用特权

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

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1059

帖子

11

粉丝