Atxmega USART流量控制

我在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);
}
不幸的是,这似乎永久禁用了发送。有任何想法吗? 最好的祝福 弗雷德里克     
已邀请:
一旦将起始位发送到线路,您必须发送包括停止位在内的其余位,否则您将损坏数据。当CTS被取消激活时,不可能立即停止发送数据,并且通常的做法是在发送停止之前允许一些额外的字节。 XMEGA系列没有任何深USART FIFO,只有发送移位寄存器和发送保持寄存器,所以如果CTS被禁用后代码停止写入USART,你应该没问题。     
我有同样的问题你描述过,虽然有一个atxmega128a1。我通过使用DMA传输仅对USART发送器实现了这一功能,并监视主循环中的RTS引脚。我知道当RTS引脚置位时,我的USART< - > USB接口的FIFO中剩下32个字节。 当引脚置为有效时,我将DMA触发源(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传输。我正在使用FTDI FT232H以2MHz波特率运行。     

要回复问题请先登录注册