zoukankan      html  css  js  c++  java
  • AT指令调试程序

    extern void Delay(__IO uint32_t nCount);
    USARType USART_SendStr(UART_HandleTypeDef * USART_Handler,char * str)
    {
        while (*str != '')
        {
            while(__HAL_UART_GET_FLAG(USART_Handler,UART_FLAG_TXE)==RESET); 
            HAL_UART_Transmit(USART_Handler,(uint8_t *)str,1,1000);
            str++;
        }
        return USARTOK;
    }
    
    
    /*
     * 功能:固定时间指令匹配函数
     * 入口参数1:串口句柄
     * 入口参数2:串口接受缓冲区
     * 入口参数3:发送的字符串
     * 入口参数4:要匹配的字符串
     * 返回值:
     *   USARTTIMEOUT:超时未读取到数据
     *   USARTOK     :成功读取到数据
     *   USARTERROR  :接受到数据,但是没有提取到*recestr
     */
    USARType USART_Cmd_Marry(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr)
    {
        /*通过串口发送指令*/
        char * val;
        char * str;
        int count1 = 0;
        int count2 = 0;
        str = recestr;
        USART_SendStr(USART_Handler,sendstr);//发送字符串
        while (*recestr != '')//如果读取到则匹配完成
        {
            if(Usart_fifo_Read(Rusart,(uint8_t *)val,1) == USARTOK)
            {
                if (*val == *recestr)//读取到的第一个字节数相同
                {
                    recestr++;
                }
                else
                {
                    recestr = str;
                    count1++;
                    if (count1 == 600)
                    {
                        return USARTERROR;
                    }
                }
            }
            else
            {
                count2++;
                Delay_ms(1);
                if (count2 > 1000)
                {
                    return USARTTIMEOUT;
                }
            }
        }
        return USARTOK;
    }
    /*
     * 功能:固定时间指令应答函数
     * 入口参数1:串口句柄
     * 入口参数2:串口接受缓冲区
     * 入口参数3:发送的字符串
     * 入口参数4:接受数据的地址
     * 返回值:
     *   USARTTIMEOUT:超时未读取到数据
     *   USARTOK     :成功读取到数据
     *   
     */
    USARType USART_Cmd_Ack(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr) 
    {
        /*通过串口发送指令*/
        char * val;    
        int count2 = 0;
    
        USART_SendStr(USART_Handler,sendstr);
        while (1)
        {
            if(Usart_fifo_Read(Rusart,(uint8_t *)val,1) == USARTOK)
            {    
                *recestr = *val;
                recestr++;
                if (*val == 10)
                {
                    *recestr = '';
                    return USARTOK;
                }
            }
            else
            {
                Delay_ms(1);
                count2++;
                if (count2 > 1000)
                {
                    return USARTTIMEOUT;
                }
            }
        }
    }
    /*
     * 功能:可变时间指令匹配函数
     * 入口参数1:串口句柄
     * 入口参数2:串口接受缓冲区
     * 入口参数3:发送的字符串
     * 入口参数4:要匹配的字符串
     * 入口参数5:限制的时间内检测,单位ms
     * 入口参数6:限制的数据大小内查找,单位字节
     * 返回值:
     *   USARTTIMEOUT:超时未读取到数据
     *   USARTOK     :成功读取到数据
     *   USARTERROR  :接受到数据,但是没有提取到*recestr
     */
    USARType USART_Cmd_Time_Marry(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr,uint16_t timeout,uint16_t countout)
    {
        /*通过串口发送指令*/
        char * val;
        char * str;
        uint16_t count1 = 0;
        uint16_t count2 = 0;
        str = recestr;
        USART_SendStr(USART_Handler,sendstr);//发送字符串
        while (*recestr != '')//如果读取到则匹配完成
        {
            if(Usart_fifo_Read(Rusart,(uint8_t *)val,1) == USARTOK)
            {
                if (*val == *recestr)//读取到的第一个字节数相同
                {
                    recestr++;
                }
                else
                {
                    recestr = str;
                    count1++;
                    if (count1 == countout)
                    {
                        return USARTERROR;
                    }
                }
            }
            else
            {
                count2++;
                Delay_ms(1);
                if (count2 > timeout)
                {
                    return USARTTIMEOUT;
                }
            }
        }
        return USARTOK;
    }
    
    /*
     * 功能:可变时间指令应答函数
     * 入口参数1:串口句柄
     * 入口参数2:串口接受缓冲区
     * 入口参数3:发送的字符串
     * 入口参数4:接受数据的地址
     * 入口参数5:限制的时间内检测,单位ms
     * 入口参数6:限制的数据大小内查找,单位字节
     * 返回值:
     *   USARTTIMEOUT:超时未读取到数据
     *   USARTOK     :成功读取到数据
     *   
     */
    USARType USART_Cmd_Time_Ack(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr,uint16_t timeout,uint16_t countout) 
    {
        /*通过串口发送指令*/
        char * val;    
        int count2 = 0;
    
        USART_SendStr(USART_Handler,sendstr);
        while (1)
        {
            if(Usart_fifo_Read(Rusart,(uint8_t *)val,1) == USARTOK)
            {    
                *recestr = *val;
                recestr++;
                if (*val == 10)
                {
                    *recestr = '';
                    return USARTOK;
                }
            }
            else
            {
                Delay_ms(1);
                count2++;
                if (count2 > 1000)
                {
                    return USARTTIMEOUT;
                }
            }
        }
    }

    这个里面一共有四段代码,其实是两段代码,只是因为需求不同而复制出来了而已

    实现原理是一样的,目的是实现AT指令的匹配,和响应返回,详细信息在代码中都给出来了,这里面用到的数据类型和程序代码都在前面的文章中给出来了,我发出来的代码都是经过测试的,绝对可行,若有疑问可以添加QQ大家相互交流

  • 相关阅读:
    Django ajax 实现 loading 效果
    K8S service 简单介绍
    K8S Pod 生命周期 (二)
    异度之刃 Xenoblade 后感
    Nested Prefab Mode 嵌套预制体 保存问题 Dirty
    GIT速成
    Surface电池阈值
    如何删除通知栏无效图标(重置任务栏通知区域)
    Mouse For Winpad
    Re:LieF ~親愛なるあなたへ~ 后感
  • 原文地址:https://www.cnblogs.com/memorypro/p/6168965.html
Copyright © 2011-2022 走看看