0

我在 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);
}

不幸的是,这似乎永久禁用了发送。有任何想法吗?

最好的问候弗雷德里克

4

2 回答 2

1

将起始位发送到线路后,您必须发送其余位,包括停止位,否则您将损坏数据。当 CTS 被停用时,不可能立即停止发送数据,通常的做法是在停止发送之前允许一些额外的字节

XMEGA 系列没有任何深 USART FIFO,只有发送移位寄存器和发送保持寄存器,因此如果您的代码在 CTS 停用后立即停止写入 USART,您应该没问题。

于 2010-11-26T08:21:17.083 回答
1

我遇到了与您描述的相同的问题,尽管使用的是 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 传输。我将它与以 2MHz 波特率运行的 FTDI FT232H 一起使用。

于 2012-05-22T09:35:51.977 回答