在UART上手动实现CTS/RTS,在STM32上无硬件流控制

在UART上手动实现CTS/RTS,在STM32上无硬件流控制,stm32,uart,flow-control,Stm32,Uart,Flow Control,我正试图让Sara-R412和STM32F103VGT6TR相互通信,偶尔会遇到一些通信中断的问题,这听起来像是在R412还没有准备好的情况下STM试图通话。(有趣的是,我也使用SARA-U201,它一点问题都没有) R412连接到UART4上的STM,数据表上说它是UART,不支持CTS/RTS。根据R412的数据表,它不支持Xon/Xoff,但通过defualt明确支持CTS/RTS 因此,我的结论是,我需要手动支持CTS/RTS 从我所读到的内容来看,由于双向通信,我对如何使用RTS感到有

我正试图让Sara-R412和STM32F103VGT6TR相互通信,偶尔会遇到一些通信中断的问题,这听起来像是在R412还没有准备好的情况下STM试图通话。(有趣的是,我也使用SARA-U201,它一点问题都没有)

R412连接到
UART4
上的STM,数据表上说它是
UART
,不支持
CTS/RTS
。根据
R412
的数据表,它不支持
Xon/Xoff
,但通过defualt明确支持
CTS/RTS

因此,我的结论是,我需要手动支持
CTS/RTS

从我所读到的内容来看,由于双向通信,我对如何使用
RTS
感到有点困惑。AFIK CTS相当直截了当:

  • CTS:当
    低时
    我可以发送数据
对于RTS,我想当我想发送数据时,我会将其设置为
HIGH
,然后在完成后将其清除?还是应该反过来

这是我的gpio设置

//  Port    Pin          Mode                   Default State       Output speed        Name
    {GPIOE, GPIO_Pin_11, GPIO_Mode_Out_PP,      GPIO_DEFAULT_LOW,   GPIO_Speed_50MHz},  // CELL_RTS
    {GPIOE, GPIO_Pin_12, GPIO_Mode_IN_FLOATING, GPIO_DEFAULT_NA,    INPUT_SPEED},       // CELL_CTS
这是我用来控制线路的代码

/*
* Make sure the module is in a Tx configuration before trying to use the Tx parameters.
*/
if (uart4.tx_sending)
{
    /*
     * If the TX_LIST node has more data to transmit, write the next byte to the UART.
     */
    if (uart4.tx_cnt < uart4.tx_list->len)
    {
        // We use mimicced hardware flow control. Don't send until we are clear to
        if (pinGet(CELL_CTS) == FALSE) USART_SendData(UART4, uart4.tx_list->ptr[uart4.tx_cnt++]);
        else pinSet(CELL_RTS);
    }
    else
    {

        /*
         * The last byte has been sent.  Disable subsequent Tx interrupts, but enable interrupt to
         * indicate last byte sent and register now empty
         */
        USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
        USART_ITConfig(UART4, USART_IT_TC, ENABLE);
        pinClear(CELL_RTS);
    }
}
/*
*在尝试使用Tx参数之前,确保模块处于Tx配置中。
*/
如果(uart4.tx\U发送)
{
/*
*如果TX_列表节点有更多数据要传输,则将下一个字节写入UART。
*/
如果(uart4.tx\u cntlen)
{
//我们使用mimicced硬件流控制。在我们清楚地知道之前不要发送
if(pinGet(CELL_CTS)==FALSE)USART_SendData(UART4,UART4.tx_列表->ptr[UART4.tx_cnt++]);
else引脚集(单元RTS);
}
其他的
{
/*
*已发送最后一个字节。禁用后续Tx中断,但启用中断以
*指示发送的最后一个字节,寄存器现在为空
*/
USART_ITConfig(UART4,USART_IT_TXE,禁用);
USART_ITConfig(UART4,USART_IT_TC,启用);
pinClear(单元RTS);
}
}