This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:msp430g2553中的 serial.available ()

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP430G2553, ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/589342/msp430g2553-serial-available-in-msp430g2553

器件型号:MSP430G2553
主题中讨论的其他器件: Energia

大家好,我正在使用 msp430g2553。 为了进行编码、我同时使用 Energia 和 CCS。  在 Energia 中有串行库。 serial.available ()、返回接收的字节数。 我想在 CCS 中实现相同的函数。 有人能告诉我如何操作?

对于 CCS 中的 UART、我有代码 www.embeddedrelated.com/.../420.php

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ener‍Gia 实现了一个中断处理程序(请参阅 USCI_ISR_handler.cHardwareSerial.cpp)、用于读取接收到的字节并将其存储到缓冲区中。 Serial.available ()函数仅返回此缓冲区中的字节数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、谢谢。 我知道 Serial.available ()只是返回缓冲区中的字节数。 在 HardwareSerial.cpp 中、它们使用了 ringbuffer。 我认为我不需要环形缓冲器。 那么、我可以在不使用环形缓冲器的情况下使用吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用程序中最适合的任何机制。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下面是我所做的: 

    // RX 串行填充
    uint8_t serRxBufAvail (void);
    uint8_t serRxGet (void);
    
    #define SER_RX_BUFSIZE (64)// 2
    uint8_t serpts RxBuf[SER_RX_BUFIdSIZE]的幂;
    
    //要读取的下一个数据的 Readx。
    // WriteIdx 会向下一个要写入的空空间添加点。
    volatile uint8_t serRxReadIdx、serRxWriteIdx;
    
    
    void EUSCIA0_IRQHandler (void){
    uint8_t Rx;
    
    uint32_t status = MAP_UART_getenableInterruptStatus (EUSCI_A0_BASE);
    
    MAP_UART_clearInterrupt= EUSCI_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_EN=
    
    EQ+
    
    (EUST_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_RATE_EN= E+
    
    
    (0):(serRxWriteIdx);
    
    }否则(status & EUSCI_A_UART_Transmit_interrupt_FLAG){
    if (serBufTxIdx = 0)
    return;
    if (serTxBuf[serBufTxIdx]= 0){
    // done
    serfTxIdx = 0;
    
    
    
    
    
    
    
    
    
    
    }serBuxeIdx =
    
    0}+(sereUARTxe+ 0) transport = 0;sereUARTxeIdx = 0+(sereUt + 0_transport = 0)
    否则、如果(serRxWriteIdx - serRxReadIdx > 0){
    return (serRxWriteIdx - serRxReadIdx);
    }否则{
    return (serRxIdeIdx - serRxReadIdx + SER_RX_BUFReadSIZE);
    }
    
    
    uint8_t serRxIdet (serRxIdx = sereIdx
    
    
    +)= sereRxReadMx (void = srxRxRxRxRxRxRxRxRxRxRxRxRx);}u读
    
    数= sereRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxR (0):(serRxReadIdx);
    }否则{
    ret ='.';
    }
    return;
    }
    
    

    为了安全起见、您可能应该关闭中断、以访问非中断处理程序中的易失性变量。

    您几乎必须使用环形缓冲区、这样您就不必一直移动字节。 下面是我所做的: