本帖最后由 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个字节,在百分之零点零几的误差率下,怎么就会出现数据传输错误了呢?
为了解决时而能接收数据、时而不能接收数据的问题,我在代码中每次接收到数据之后就对串口重新初始化,就可以每次都接收到数据了(如下图),应该是接收到数据之后没有将某个标志位复位吧。
本次实验暂告一段落,希望厂家的工程师及有经验的坛友提供更简单明了的示例代码。
|