C Atmega切换变量对于9位UART太慢

C Atmega切换变量对于9位UART太慢,c,uart,atmega,9-bit-serial,C,Uart,Atmega,9 Bit Serial,我已经编写了一些代码来向usart输出9位消息 代码如下: bool_t SERIAL__TX_SEND_NINE(U8_t ch, bool_t nine) // send a character { bool_t result = SE_TRUE; // assume OK // transceiver is on so send as soon as the buffer is ready while(SERIAL__TX_READ

我已经编写了一些代码来向usart输出9位消息

代码如下:

bool_t SERIAL__TX_SEND_NINE(U8_t ch, bool_t nine)         // send a character
{

  bool_t result = SE_TRUE;              // assume OK

  // transceiver is on so send as soon as the buffer is ready
  while(SERIAL__TX_READY() == SE_FALSE)
  {                                     // make sure the Tx buffer is ready for another character
  }
  if (nine == TRUE)
  {   
    //SERIAL_USART_B |= 0x01;   
    UCSR0B &= ~(1<<TXB80);
    UCSR0B |= (1<<TXB80);
  }
  else
  {     
    //SERIAL_USART_B &= 0xFE;   
    UCSR0B &= ~(1<<TXB80);
  }

  SERIAL_UDR = ch;                      // then send the next character
  SERIAL_USART_A |= SERIAL_TX_DONE;     // clear the done flag
  return result;                        // OK
}

//! \brief  send a byte on the serial communications bus if ready - return TRUE if successful
//!
//! \param  ch the byte to transmit
//! \return SE_TRUE if the byte was sent, SE_FALSE can't happen for this device
bool_t serial_0_tx_send_if_ready_nine(U8_t ch, bool_t nine)         // send a character if able to
{
    // if buffer ready?
    if(SERIAL__TX_READY() == FALSE)
    {
        return FALSE;
    }

return SERIAL__TX_SEND_NINE(ch, nine);           // send the next character
}
但我不明白为什么会这样

atemga324p在存储未签名字符(bool\t)时是否有定时延迟

任何想法都将不胜感激

其他细节。单片机:Atmega324p。操作系统:Windows10。编译器:Atmel Studio 7.0。优化:无。

解决了这个问题

由于通信端口未准备好发送数据,因此当以全速运行时,serial_0_tx_send_if_ready_nine(…)返回false

因此,它保留了那个字节并重新运行send函数,然而,切换已经被更改,我没有反转切换

我将代码的一部分更改为以下内容:

  if(serial_0_tx_send_if_ready_nine(data, nine_toggle) == SE_FALSE)
  {
    // but couldn't send it so put it back
    RingBuffer8_PutBackByte(&handle->out_rb, data);
    nine_toggle ^= 1; //<== Added this line
  }
if(串行\u 0\u发送\u如果\u准备就绪\u九(数据,九切换)=SE\u假)
{
//但无法发送,所以请将其放回原处
RingBuffer8_putbackyte(&handle->out_rb,数据);

nine_toggle^=1;//您只发布了部分代码,而且存在大量间接寻址,因此很难知道发生了什么。我建议尽可能简化它并发布一个。感谢您的评论。我将在下一篇文章中牢记您的建议。我已经解决了问题。serial_0_tx_send_if_ready_nine()返回false,因为通信尚未准备就绪。但我没有反转切换,因为循环使用相同的字节再次运行。
  if(serial_0_tx_send_if_ready_nine(data, nine_toggle) == SE_FALSE)
  {
    // but couldn't send it so put it back
    RingBuffer8_PutBackByte(&handle->out_rb, data);
    nine_toggle ^= 1; //<== Added this line
  }