extern void Delay(__IO uint32_t nCount);
USARType USART_SendStr(UART_HandleTypeDef * USART_Handler,char * str)
{
while (*str != '\0')
{
while(__HAL_UART_GET_FLAG(USART_Handler,UART_FLAG_TXE)==RESET);
HAL_UART_Transmit(USART_Handler,(uint8_t *)str,,);
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 = ;
int count2 = ;
str = recestr;
USART_SendStr(USART_Handler,sendstr);//发送字符串
while (*recestr != '\0')//如果读取到\0则匹配完成
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
if (*val == *recestr)//读取到的第一个字节数相同
{
recestr++;
}
else
{
recestr = str;
count1++;
if (count1 == )
{
return USARTERROR;
}
}
}
else
{
count2++;
Delay_ms();
if (count2 > )
{
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 = ; USART_SendStr(USART_Handler,sendstr);
while ()
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
*recestr = *val;
recestr++;
if (*val == )
{
*recestr = '\0';
return USARTOK;
}
}
else
{
Delay_ms();
count2++;
if (count2 > )
{
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 = ;
uint16_t count2 = ;
str = recestr;
USART_SendStr(USART_Handler,sendstr);//发送字符串
while (*recestr != '\0')//如果读取到\0则匹配完成
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
if (*val == *recestr)//读取到的第一个字节数相同
{
recestr++;
}
else
{
recestr = str;
count1++;
if (count1 == countout)
{
return USARTERROR;
}
}
}
else
{
count2++;
Delay_ms();
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 = ; USART_SendStr(USART_Handler,sendstr);
while ()
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
*recestr = *val;
recestr++;
if (*val == )
{
*recestr = '\0';
return USARTOK;
}
}
else
{
Delay_ms();
count2++;
if (count2 > )
{
return USARTTIMEOUT;
}
}
}
}

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

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

AT指令调试程序的更多相关文章

  1. CPU标志寄存器

    这个标志寄存器似乎很重要,不干掉它,中断这玩意还进行不下去了,但是过于复杂,都是一些跟计算结果相关的位,头痛 (这是别人写的一篇非常好的关于标志寄存器的文章http://blog.csdn.net/w ...

  2. 利用foo函数的Bof漏洞攻击:构造攻击字符串

    利用foo函数的Bof漏洞攻击:构造攻击字符串 一.基础知识储备 objdump反汇编指令.gdb函数调试运行.Perl语言.|管道符 二.实验步骤 1. 通过反汇编了解程序功能及代码 ①反汇编查看文 ...

  3. (原创)解决远程桌面连接远程应用时,出现 '应用程序错误: '0x7c931780'指令引用的 '0x89abcdef' 内存。该内存不能为 'read'"

    公司的部分应用为cs结构,没有web版的,这些应用的外部访问基本都是通过使用windows server 2008 r2的远程桌面服务来实现的. 个人感觉微软远程桌面服务问题很多,今天有同事使用Rem ...

  4. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  5. Linux高级编程--04.GDB调试程序(查看数据)

    查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...

  6. Linux高级编程--04.GDB调试程序(设置断点)

    调试已运行的程序 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序. 先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程 ...

  7. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  8. [转] 用GDB调试程序(五)

    转:http://blog.csdn.net/haoel/article/details/2883 查看运行时数据———————        在你调试程序时,当程序被停住时,你可以使用print命令 ...

  9. GDB单步调试程序

    linux下gdb单步调试 用 GDB 调试程序 GDB 概述———— GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 ...

随机推荐

  1. android 任意类 获得屏幕大小

    方法一 WindowManager managet=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display ...

  2. React学习笔记-7-销毁阶段

    销毁阶段可以使用的函数:componentWillUnmount:在删除组件之前进行清理操作,比如计时器和事件监听器.因为这些函数都是开发者手动加上去的,react不知道,必须进行手动清理. 实例第一 ...

  3. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优

    libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...

  4. ExtJS基础知识总结:自定义日历和ComboBox控件(二)

    概述 1.ExtJS 5不支持日期选择框中只选择年月,为了满足ExtJs5可以实现选择年月的功能,查询网上资料,整理出来了相应的处理方式,最终实现的效果如下图: 2.ExtJS 控件丰富,如果需要实现 ...

  5. 解决poshytip 表单高度大于屏幕高端 显示问题

    Poshy Tip是一款非常友好的信息提示工具,它基于jQuery,当鼠标滑向链接时,会出现一个信息提示条.信息的内容直接可以在HTML里设定也可以是从服务端调用的数据,该插件还提供了很多属性和方法. ...

  6. 解决select2在bootstrap的modal中默认不显示的问题

    在Bootstrap中的Modal,select2插件会有不显示,因为其z-index小于modal,还有另外一个问题是,修正z-index之后,select2不会自动失去焦点的问题.代码解决如下: ...

  7. CozyRSS开发记录9-快速实现一个RSS解析器

    CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...

  8. 控制台查看原生sql

    情况:当tomcat运行时,项目运行过程中,控制台没有打印出原生sql语句: 解决办法如下: 在 META-INF  文件夹下,查找 persistence.xml 这个文件(这里注意可能一个项目不止 ...

  9. MySQL数据库1067 问题

    1.MySql1067错误解决方法 http://blog.csdn.net/mhmyqn/article/details/17043921   MySql 1045解决方法 my.ini  mysq ...

  10. TotoiseSVN的基本使用方法

    TotoiseSVN的基本使用方法 在 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]中,我已经讲解了怎样安装TortoiseSVN.在上面的讲解中已经讲了怎么使用VisualS ...