CH582串口问题

我目前使用 ch32v203 工作正常。 附件是 ch32v203 的 uart 代码,其中在发送完美运行的新字节之前检查传输完成标志。 但是当使用ch582时我发现很难发送。 UART0_SendString 函数工作正常,但如果您立即使用 UART0_SendByte,则并非所有完整字符串都从先前的 sendstring 函数传输。 我找不到像 32v203 中那样的传输完成标志。

请为此建议一个代码片段。



//CH32V203?code
void?USART1_PrintS(u8?*uart_text)
{
????while(*uart_text)???????????????????????????????????????????????????????????//?While?not?end?of?text
????{
????????while(USART_GetFlagStatus(USART1,?USART_FLAG_TC)?==?RESET);
????????USART_SendData(USART1,*uart_text);
????????uart_text++;
????}
}
//CH582?code
void?UART0_SendString(uint8_t?*buf,?uint16_t?l)
{
????uint16_t?len?=?l;

????while(len)
????{
????????if(R8_UART0_TFC?!=?UART_FIFO_SIZE)
????????{
????????????R8_UART0_THR?=?*buf++;
????????????len--;
????????}
????}
}
//如果所有?UART0_SendByte?都被删除,则?sendstring?会正确打印所有字符,否则不会。

UART0_SendString("Hello?World\r\n",13);
UART0_SendByte('O');
UART0_SendByte('K');
UART0_SendByte(13);
UART0_SendByte(10);

您能否发送一个代码片段以在没有任何 FIFO 的情况下使用? 我还没有测试接收部分,我需要中断每个字节(标准 uart 兼容)。


您好,FIFO方式可以缓存数据来缓解收发包压力,是推荐使用的。

UART0_SendByte是直接往R8_UART0_THR寄存器中填数据;UART0_SendString是往FIFO中填写数据,FIFO中的内容会再经由R8_UART0_THR发出。UART0_SendString调用完后,有一部分还未发出,此时直接填写UART0_SendByte会导致数据丢失。

针对您反馈的问题,可以在UART0_SendString调用后加一行代码用于发包等待。

while(R8_UART0_TFC);

在收包方向“中断每个字节”也可以用FIFO缓存的方式实现,调用UART0_ByteTrigCfg将触发字节数配置为1即可逐字节中断。

如果不想使用任何FIFO功能,可以在UART0_DefInit中清零R8_UART0_FCR寄存器。


只有登录才能回复,可以选择微信账号登录