我在Atxmega256上遇到了一些关于USART流量控制的问题。我正在与使用RTS/CTS进行流量控制的调制解调器通信。一旦调制解调器将CTS设置为低,我想停止发送数据,直到它再次变高。我目前正在使用中断驱动的USART例程,似乎找不到停止发送的好方法。如果我只是在CTS变低时停止发送,发送缓冲区中已准备好的数据仍将被发送,因此会丢失。
我已经尝试了以下方法来禁用/启用发送:
if(false == clearToSend()) {
USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_OFF_gc);
while(false == clearToSend()) {}
USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_LO_gc);
}不幸的是,这似乎永久禁用了发送。有什么想法吗?
向Fredrik致以最好的问候
发布于 2010-11-26 16:21:17
一旦开始位被发送到线路,您必须发送包括停止位在内的其余位,否则将损坏数据。当CTS被停用时,不可能立即停止发送数据,通常的做法是在停止发送之前允许额外的几个字节。
XMEGA系列没有任何深度USART FIFO,只有传输移位寄存器和传输保持寄存器,因此,如果您的代码在CTS停用后立即停止写入USART,您应该没有问题。
发布于 2012-05-22 17:35:52
我遇到了你所描述的同样的问题,只是使用了atxmega128a1。我只为USART发射器实现了这一点,使用DMA传输,并从主循环监控RTS引脚。我知道当RTS引脚断言时,我的USART<->USB接口的FIFO中还有32个字节。
当引脚有效时,我将直接存储器存取触发源(DMA.CH0.TRIGSRC)从DMA_CH_TRIGSRC_USARTC0_DRE_gc改为DMA_CH_TRIGSRC_OFF_gc。这样,DMA就不再被触发,并停止传输。当RTS引脚再次变低时,我将触发源改回DMA_CH_TRIGSRC_USARTC0_DRE_gc。
此方法需要轮询监控RTS线路并使用DMA USART传输。我使用的是运行在2 2MHz波特率的FTDI FT232H。
https://stackoverflow.com/questions/4265672
复制相似问题