PIC16 和 EUSART
PIC16 and 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
会在发送下一个字符之前进行此检查,您可能想查看源代码以了解它是如何完成的。
我正在尝试在 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
会在发送下一个字符之前进行此检查,您可能想查看源代码以了解它是如何完成的。