各位好: 最近在研究MCU與感測器結合應用,使用UART進行資料接收,但發現接收端好像來不急接收感測器端吐出來的資料,目前設定的情況是我使用Uart中斷接收的方式,buadrate設定為115200,感測器由0開始計數,但接收端的部份中間固定有幾比資料會遺失,請問能否協助解答? UART DataBuff[0] = 0x2 UART DataBuff[0] = 0x5 UART DataBuff[0] = 0x8 UART DataBuff[0] = 0x11 UART DataBuff[0] = 0x14 UART DataBuff[0] = 0x17 UART DataBuff[0] = 0x20 UART DataBuff[0] = 0x23
|
你这回调函数里的代码执行时间过长,就会导致数据丢包。printf函数就相当于ms延时了。115200的波特率,数据包之间的时间间隔大概在86us左右,也就是说你收到第一个数据之后,86us左右第二个数据就会到达。所以为了不丢包,你要尽可能缩减回调中的时间消耗。
if(DataBuff[RxLine-1]==0xff && DataBuff[RxLine-2]==0xff && DataBuff[RxLine-3]==0xff && DataBuff[RxLine-4]==0xff) 这里的判读会发生错误,当RXLINE小于4时,取的值已经超出范围。回调函数尽量只做赋值,数据打印或者查询在外部处理。
if(DataBuff[RxLine-1]==0xff && DataBuff[RxLine-2]==0xff && DataBuff[RxLine-3]==0xff && DataBuff[RxL ...
針對Rxline<4的情況請問您有比較好的處理方式可以提供參考嗎?
你这回调函数里的代码执行时间过长,就会导致数据丢包。printf函数就相当于ms延时了。115200的波特率,数据 ...
除了printf外,想請問是否有其它可以做修改的部份?
針對Rxline
在外部增加一个RXLINE的判断,目前只能是这样。另外,我感觉应该用UartHandle结构体中接收缓冲区的内容进行操作。
除了printf外,想請問是否有其它可以做修改的部份?
个人拙见:你这个回调函数中应该是通过固定的结束符连续四个0xFF来判断数据结束的吧。换个思路可以利用波特率的特性,即每个数据之间的时间间隔是固定的,以这个时间间隔来判定数据是否结束(可以使用定时器进行时间倒数,超时自动认定数据结束)。至于数据的内容正不正确不应在这里进行处理判断,这里只做一件事就是数据的接收。在数据接收完毕的时候可以手动设置一个标志位(表明数据接完了),在其它地方轮询判断该标志位,然后再对缓冲区中的数据进行判断。
像这种情况,中断接收的话,建议优化下接收代码,别在中断里耗太久。如果还有其它中断,注意合理安排中断优先级。波特率如果可以下调的话也可调低点。 最好的办法就是DMA接收。