博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MCU多串口收发
阅读量:6905 次
发布时间:2019-06-27

本文共 4306 字,大约阅读时间需要 14 分钟。

常用稳定,易操作的实现

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
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,...);

 

转载于:https://www.cnblogs.com/firstparke/p/8351424.html

你可能感兴趣的文章
记 移动端页面中莫名其妙的渲染BUG
查看>>
[转载]深入理解Python异步编程(上)
查看>>
java版MD5签名工具类
查看>>
python中的常用模块
查看>>
百度UEditor(富文本编辑器)的基础用法
查看>>
天空的另一半
查看>>
面向 Photoshop 的英特尔® Texture Works 插件
查看>>
Docker - 配置国内加速器加速镜像下载
查看>>
批量删除Sql Server对象(表,存储过程,触发器)
查看>>
[LeetCode]Remove Linked List Elements
查看>>
QTableWidget简单操作
查看>>
2018-2019-1 20165318《信息安全系统设计基础》第六周课上测试
查看>>
mongodb索引
查看>>
HDU 1053 Entropy
查看>>
Jenkins+Gradle+Sonar进行Java项目代码分析
查看>>
JAVA并发,线程优先级
查看>>
Selenium Web 自动化 - 项目持续集成(进阶)
查看>>
用于string对象中字符截取的几种函数总结——语法、参数意义及用途举例
查看>>
source tree使用经验
查看>>
linux 压缩文件 查找
查看>>