CH579 串口接收长字符串

官方例程中串口中断有字符限制,根据业务需要编写一个能接收更长的数据的串口程序。

#include "CH57x_common.h"
#include 

UINT8 RxBuff[36];                  //存储要接收的字符串
UINT8 Buff[40];                    //串口接收缓冲数组
UINT8 RxID = 0;                    //字符串存储自增变量

/* 主循环 */
int main()
{    
    /* 配置串口1输入:先配置IO口模式,再配置串口 */
    GPIOA_SetBits(GPIO_Pin_9);                      // tx上拉
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      // RXD-配置上拉输入
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
    UART1_DefInit();                                //串口初始化
    UART1_ByteTrigCfg(UART_1BYTE_TRIG);                       //设置触发方式1字节
    UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); //设置接收触发
    NVIC_EnableIRQ(UART1_IRQn);                               // 开启串口中断
    while(1);
}



/* 串口中断处理程序 */
void UART1_IRQHandler(void)
{
    UINT8 i;

    switch (UART1_GetITFlag())
    {
    case UART_II_LINE_STAT: // 线路状态错误
        UART1_GetLinSTA();
        PRINT("UART1 LINE ERROR");
        break;

    case UART_II_RECV_RDY:          //数据达到设置触发点
        Buff[0] = UART1_RecvByte(); //接收1个字节赋值给Buff[0]
        if (Buff[0] == 'S')         //假设接收数据首字母为S,长度为33字节
        {
            RxBuff[RxID] = Buff[0];
            if (RxID > 34)
            {
                RxID = 0; // 计数复位
                UART1_SendString(RxBuff, sizeof(RxBuff)); // 发送接收到的完整数据
            }
            else
            {
                RxID++;
            }
        }
        break;

    case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成
        i = UART1_RecvString(RxBuff);
        UART1_SendString(RxBuff, i);
        break;

    case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
        break;

    case UART_II_MODEM_CHG: // 只支持串口0
        break;

    default:
        break;
    }
}

你可能感兴趣的:(低功耗蓝牙开发,单片机,stm32,嵌入式硬件,arm,物联网)