想实现的功能:
1、使用定时器捕获功能,捕获外部脉冲,对其计数。
2、串口波特率9600,8N1,上位机每1秒刷新一次数据(上位机发命令给单片机,5438收到命令后,返回当前数据给上位机)
现遇到的问题:
1、假设测量10秒钟,如果测量过程中,上位机软件每1秒请求一次数据,那么就会导致测得的数据比实际值小15%左右;
2、如果等测量10秒结束后,上位机软件再去请求数据,那么测得的数据就没有误差;
总结:
1、尝试提高波特率,虽然能减小误差,但是始终还是不能彻底解决问题。
问题:
1、我用timer0开了1秒定时中断,在中断中刷新数据。是不是软件流程不合理?
2、频繁进入串口中断,导致捕获过程被频繁打断,这如何破?
3、用DMA传输,目前测试了数据通过DMA直接发到串口发送缓存UCA0TXBUF,但还是存在一定误差。
我想把串口接收也做成DMA,但是不知到串口中断接收这里该怎么写了?
灰小子:
肯定是程序设计不合理,测量和通讯两部分相互影响了。
具体是哪里的原因,要看代码才能知道。
Susan Yang:
等测量结束后上位机再去请求数据,这个一般都不会出问题的。而在测量过程中去请求数据,程序就很容易出问题了。请问能否给出您“假设测量10秒钟,如果测量过程中,上位机软件每1秒请求一次数据,那么就会导致测得的数据比实际值小15%左右” 这部分的代码?
user4715584:
回复 Susan Yang:
上面3张图片就是测量部分的主要部分,如果在测量过程中,上位机每1秒请求一次数据,那么数据就会比 测量完成 再去请求 得到的数据小。
下面给出串口接收部分:
一包数据接收完成
数据解析:
这就是整个流程了,我不确定是不是软件流程问题,推理了多次,感觉没问题(可能是自己没发现)。现在在尝试用DMA;至于串口模拟收发FIFO,感觉没啥用。
灰小子:
回复 user4715584:
不要在中断服务程序里放太多代码,尤其是运行时间较长的代码。