工具与软件:
您好!
有人可以给我一些关于如何接收动态长度的 SCI 数据(可以从1字节到超过16字节)的提示吗?
由于 SCI 通信是较大的时序关键型固件的一部分、因此不能选择轮询 FIFO。
以下是我尝试的东西、所有这些都启用了 RX 中断。 禁用环回功能。 使用终端应用将数据发送到 MCU。
1.无 FIFO 使用 while
使用它从 ISR 接收数据
INT I = 0;
while (SCI_isDataAvailableNonFIFO (UartUplink_BASE)){
UART_rxdata[i]= SCI_readCharNonBlocking (UartUplink_BASE);
I++;
}
结果:
如果发送的数据长度为1字节、则表示已正确接收。 如果大于1字节、则仅接收第一个数据。
2.没有 while 的 FIFO
在 ISR 外部、有一个计数器 var 来增加数据接收。
使用它从 ISR 接收数据
静态 cnt;
UART_rxdata[cnt]= SCI_readCharNonBlocking (UartUplink_base);
CNT++;
//处理程序在此处循环接收缓冲区
结果:
如果发送的数据长度为1字节、则表示已正确接收。 如果多于1字节、则 ISR 第一个接收到的数据是正确的、第二个接收到的字节是错误的。 无论发送数据的长度如何、都只接收到2个字节。
3.带有 RX 1/16满中断的 FIFO
使用它从 ISR 接收数据
UART_rxnum = SCI_getRxFIFOStatus (UartUplink_BASE);
SCI_readCharArray (UartUplink_BASE、uart_rxdata、uart_rxnum);
结果:
如果发送的数据长度为1字节、则表示已正确接收。 如果超过1字节、则无论发送数据的长度如何、ISR 都会被调用两次。 第一个 ISR 调用正确接收第一个字节、第二个 ISR 调用接收错误的第二个字节。 后续字节完全不会接收到。
4、FIFO 与 RX 16/16满中断
UART_rxnum = SCI_getRxFIFOStatus (UartUplink_BASE);
SCI_readCharArray (UartUplink_BASE、uart_rxdata、uart_rxnum);
结果:
如果发送的数据恰好填满 FIFO、那么它会被正确接收。 如果发送的数据超过缓冲区、则前16个字节被正确接收、但下一个16字节接收将是错误的。 在缓冲区已满之前不会接收数据。
上述任何行为都不可取、尤其是当所有行为都可能破坏 所接收到的数据时。
在 C2000芯片上接收可变长度 SCI 数据的建议方式是什么?
如果上述行为看起来异常、是否有人可以就我可能做错了什么给出建议?
谢谢你。