zoukankan      html  css  js  c++  java
  • MCU多串口收发

    常用稳定,易操作的实现

    static uint8_t    gString[200];       // 开的越大传的越慢
    COM_PORT_INFO g_uart_struct[COM_PORT_NUM];
    
    void COMx_Send(uint8_t data[],uint16_t len, COMM_PORT_TYPE chID)
    {
        uint16_t i;
        UART_HandleTypeDef  UsartCom;
    
         switch(chID)
            {
            case GPS_UART_INDEX:
                UsartCom = huart4;
                break;    
            case TTL_UART_INDEX:
                UsartCom = huart3;
                break;
            case BLE_UART_INDEX:
                UsartCom = huart1;
                break;
            default:
                return;
            }
    
        for(i=0;i<len;i++)
        {
            while((__HAL_UART_GET_FLAG((&UsartCom), UART_FLAG_TXE) ? SET : RESET) == RESET);
            (&UsartCom)->Instance->DR = data[i];
        }
    }
    
    
    void COMx_Revd(COMM_PORT_TYPE chID)
    {
        uint16_t timeout;
        uint16_t max_len;
        UART_HandleTypeDef  UsartCom;
    
        if (chID == GPS_UART_INDEX)
        {
            UsartCom = huart4;
            timeout = GPS_RX_FRAME_TIMEOUT;
            max_len = USART_GPS_MAX_Rx_BUF_LEN;
        }
        else if(chID == TTL_UART_INDEX)
        {
            UsartCom = huart3;
            timeout = TTL_RX_FRAME_TIMEOUT; 
            max_len = USART_TTL_MAX_Rx_BUF_LEN;
        }
        else if(chID == BLE_UART_INDEX)
        {
            UsartCom = huart1;
            timeout = BLE_RX_FRAME_TIMEOUT;     
            max_len = USART_BLE_MAX_Rx_BUF_LEN;
        }
    
        if(__HAL_UART_GET_FLAG((&UsartCom), USART_SR_RXNE) != RESET)
        {
            if(g_uart_struct[chID].Rx_counter >= max_len)
            {
                g_uart_struct[chID].Rx_counter--;
            }
            g_uart_struct[chID].RecvDataBuff[g_uart_struct[chID].Rx_counter++] = READ_REG((&UsartCom)->Instance->DR);
            g_uart_struct[chID].Rx_timeout = timeout;
        }
        __HAL_UART_CLEAR_FLAG((&UsartCom), USART_SR_PE|USART_SR_FE|USART_SR_NE|USART_SR_ORE);
    }
    
    void CommProc_uart(void)
    {
        uint8_t i;
        uint8_t *data_buf;
        uint16_t data_len;
        
        for(i=GPS_UART_INDEX;i<=BLE_UART_INDEX;i++)
        {
            if((i == TTL_UART_INDEX) && (g_uart_struct[i].RxDoneFlag))
            {
                g_uart_struct[i].RxDoneFlag = false;
                data_len = g_uart_struct[i].Rx_counter;
                data_buf = g_uart_struct[i].RecvDataBuff;
                /* user add */
                memset(&g_uart_struct[i].RecvDataBuff,0,data_len);
                g_uart_struct[i].Rx_counter = 0;
            }
        }
    }
    
    
    void CheckUartRxDone(void)
    {
        static uint32_t sys_tick_pre_val=0;
        static uint32_t sys_tick_cur_val=0;
        uint32_t i,past_ms_val;
        sys_tick_cur_val = HAL_GetTick();
        past_ms_val = sys_tick_cur_val-sys_tick_pre_val;
        for(i=GPS_UART_INDEX;i<=BLE_UART_INDEX;i++)
        {
            if(g_uart_struct[i].Rx_timeout > 0)
            {
                if(g_uart_struct[i].Rx_timeout >= past_ms_val)
                {
                    g_uart_struct[i].Rx_timeout -= past_ms_val;
                }
                else
                {
                    g_uart_struct[i].Rx_timeout = 0;
                }
                
                if(g_uart_struct[i].Rx_timeout == 0)
                {
                    g_uart_struct[i].RxDoneFlag = true;
                }
            }
        }
        sys_tick_pre_val = sys_tick_cur_val;
    }
    
    void LocalPrintf(const char *fmt,...)
    {    
        va_list ap;     
        memset(gString, 0, sizeof(gString));   
        va_start(ap,fmt);     
        vsprintf((char*)gString,fmt,ap);
        COMx_Send(gString, sizeof(gString), TTL_UART_INDEX);
        va_end(ap);
    }
        #define     USART_GPS_MAX_Rx_BUF_LEN           ((uint16_t)512)
        #define     GPS_RX_FRAME_TIMEOUT               ((uint16_t)50)
    
        #define     USART_TTL_MAX_Rx_BUF_LEN           ((uint16_t)512)
        #define     TTL_RX_FRAME_TIMEOUT               ((uint16_t)50)
    
        #define     USART_BLE_MAX_Rx_BUF_LEN           ((uint16_t)512)
        #define     BLE_RX_FRAME_TIMEOUT               ((uint16_t)150)///帧超时时间
    
    
        #define COM_PORT_NUM                    ((uint8_t)3)    
    
        typedef struct
        {
            uint16_t Rx_counter;
            uint16_t Rx_timeout;       //ms
            bool     RxDoneFlag;       //断包标志
            uint8_t  RecvDataBuff[1000];       //包缓存
        }COM_PORT_INFO;
        
        typedef enum
        {
            GPS_UART_INDEX = 0,                 /* GPS口 */
            TTL_UART_INDEX,                     /* 维护口*/
            BLE_UART_INDEX,                     /* 蓝牙口 */
        }COMM_PORT_TYPE;                        /* 端口类型 */
    
        extern COM_PORT_INFO g_uart_struct[COM_PORT_NUM];
    
    
        void COMx_Revd(COMM_PORT_TYPE chID);
        void COMx_Send(uint8_t data[],uint16_t len, COMM_PORT_TYPE chID);
        void CommProc_uart(void);
        void CheckUartRxDone(void);
        void LocalPrintf(const char *fmt,...);
    真正的对手会灌输给你大量的勇气 --卡夫卡
  • 相关阅读:
    决策树
    flask数据库的迁移
    flask的查询,一对多,多对多
    django的验证码
    第一讲:python环境配置(python2.7+python3.7)
    pytest
    【TS】-类型兼容性
    HTML--src和href的区别
    JS--为什么null是对象?
    JS--null和undefined的区别
  • 原文地址:https://www.cnblogs.com/firstparke/p/8351424.html
Copyright © 2011-2022 走看看