使用ESP8266或者其它模块串口AT指令是比较常见,今天我们学习如何设计和使用AT指令,方案是:单片机STM32+串口通讯+AT指令+labview上位机,涉及STM32和Labview代码的完整串口数据通讯流程,具体要求如下: 任务:学会使用labview结合STM32语言实现AT指令数据通讯 要求: 01.STM32串口基本配置、发送、接收数据的语法; 02.构建STM32单片机的AT指令处理体系 03.学会C语言的字符串处理函数strstr、strcmp函数、atoi函数使用; 03.实现AT接收、AT发送、AT的应答、实现灵活指令; 04.用ESP8266模块实现labview数据的接收和数据的处理; 关键词:labview、STM32、ESP8266、strcmp函数、strstr函数、atoi、VISA 备注1:手机微信可浏览相关高清图片; 二、串口通讯原理 06、产品通常需要获取数据和设置数据两个操作,而且字符长度不固定,比如Modbus协议和AT指令,RTU模式和ASCII模式;
AT指令不固定长度,串口接收函数需要获取到接收的起点终点和长度,同时需要有错误处理、超时恢复机制、超长恢复机制; #include 'stm32f10x.h' #include 'stdio.h' #include 'string.h' //strstr strlen strcmp char USART2_RX_BUF[200]=''; //接收缓冲,最大USART_REC_LEN个字节. u8 uart2_i=0; u16 USART2_REC_LEN=4; u16 USART2_RX_STA=0; //串口字节指针 //接收字节长度//接收状态标记 char * user_after(char *instr,char *markstr)//输入源字符串和目标字段,输出目标字段后面的字符 {//剪切处理字符串(指针方法) char *p; int i; if(strstr(instr,markstr)!=NULL){ p=strstr(instr,markstr); i=strlen(markstr); p+=i; return p; } else{ p=NULL; } }
int main(void) { float i=0.0f; 串口初始化(); //串口初始化 while(1) { if(usercmd_en==1) // 需要重新定义 USART2_RX_STA { // usercmd 需要重新定义 USART2_RX_BUF if(strcmp(usercmd,'AT')==0) printf('ok\r\n'); //应答测试指令 if(strcmp(usercmd,'AT+GetADC')==0) printf('CH1=%f \r\n',读取到的数据); //读取参数类 if(strstr(USART2_RX_BUF,'AT+SetDAC')!=NULL){ //参数设置类 strbuf = user_after(USART2_RX_BUF,'AT+SetDAC='); i0buf=atoi(strbuf); 设置模拟输出函数(i0buf); } usercmd_en=0; } } }
void USART_IRQHandler(void) { u8 r;//串口2中断服务程序(正常)字符限制,有结束字符检测,未加入超时清空缓存区 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收中断 { r =USART_ReceiveData(USART2);//(USART2->DR); //读取接收到的数据 USART2_RX_BUF[uart2_i++]=r; if(uart2_i>200)uart2_i=0; //数据超过长度 if(r=='\n' && USART2_RX_BUF[uart2_i-2]=='\r') //判断是否回车,可加入CRC { USART2_RX_BUF[uart2_i-2]='\0'; //加结束符号,将数据去掉回车符号 USART2_REC_LEN=uart2_i-2; //记录字符长度 USART2_RX_STA=1; //接收到一条未知数据需要处理,#define usercmd_en USART2_RX_STA 重定义为 uart2_i=0; //清零索引指针 } } } 五、上位机串口数据对接 Labview串口读取最常用的方式是轮询查询读取缓存区的数据(架构代码1),只要将轮询时间调整合适就能实现正常数据接收,只要时间合适接收就没问题,时间合适就可以! 通过架构代码1来分析轮询读取串口数据的问题: 在现实应用中串口控制通常是不规定长度的指令,那么运用代码1模式接收数据会出现:短指令正常,长指令出错的情况。那按照最长指令计算等待时间,会发现等待时间变长不能满足响应时间的要求。 01、如何在不影响<实时响应>性能的情况下<适应不同长度>的指令? 02、按照代码2的思想是:运用上位机等待中断方式,独立一个进程作为生产者,短时间接收数据,然后将相邻有效数据拼接起来验证,接收为空时清空缓存(可在代码2中添加验证成功时清空缓存)。 03、接下来进行上位机的实例介绍,选择有成熟协议的ESP8266无线模块进行上位机AT指令的对接: 03、可以参考使用该labview结构来设计STM32的AT指令对接上位机,注意事件结构进入指定事件一定取消锁定选项不要锁定前面板(锁定后所有前面板局部变量冻结不再实时更新),如果对应事件中用到局部变量数据,会有计算出错现象,还不容易查找错误点,建议尽量多使用数据流设计,减少局部变量的使用; |
|
来自: 西北望msm66g9f > 《培训》