PIC16 和 EUSART

问题描述

我正在尝试在 PIC16F 上通过 RS485 进行 EUSART 设置。对于 RS485,我有一个外部电路 MAX3430 来转换为 RS485。我能够发送和接收数据。我遇到的问题是,当我在 TX 事务后切换回 RO 时,我注意到最后两个字节没有被发送。看起来,如果我按照下面的方式做(我使用 RB6 引脚作为 RO/TX 之间的开关),它会很快,最后两个字节永远不会被传输。这里的最佳做法是什么?我猜在上次发送 TX 后会增加一些延迟,但我不想为此停止我的整个程序,除非这是一般建议?我也在探索一个计时器作为一种可能的解决方案,只需要一种方法来重置计时器,所以在这种情况下我总是得到相同的延迟,目前正在研究这个替代方案。任何想法表示赞赏。

IO_RB6_SetHigh(); // Enable TX mode
for(uint8_t i = 0; i < sizeof(msg); i++)
{
         EUSART1_Write(msg[i]);
}
IO_RB6_SetLow(); // Enable Read mode

谢谢, 马库斯

解决方法

您正在传输完成前切换到 RX。您需要在调用 IO_RB6_SetLow() 之前等待两个符号时间,或者(更好)检查 USART Tx 缓冲区的状态以查看它是否已完成传输。有一个叫做“发送移位寄存器状态位”的位,在PIC16F877A中叫做TXSTA.TRMT

EUSART1_Write 会在发送下一个字符之前执行此检查,您可能需要查看源代码以了解它是如何完成的。