2015-10-20 22:45:29 liucheng5037 阅读数 4081
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

很多外部模块是使用串口的方式与单片机通信的,但有的单片机只有一个串口,且不能硬件仿真,比如我使用的STC90C516,如果将唯一的串口给了外部模块,就不能打印调试信息了。

不过如果是使用AT指令只这样的模块,比如蓝牙SPP,WiFi模块,是使用AT指令的方式通信的

我们可以保留单片机串口与PC的连接,串口同时与模块连接,这样单片机的发送信息同时被模块和PC收到了。

模块只对AT指令有反应,对其他格式不正确的指令无反应,

如:

printf("AT+RST\r\n");//模块对该指令有反应
printf("DEBUG+RST Test\r\n");//模块对该指令无反应</span>

这样串口就可以接收发送的数据和调试信息了,注意指令后面要加换行符。

2018-03-27 13:47:51 a136498491 阅读数 6726
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

AT指令解析貌似没啥快捷的方式。

我最一开始用M6311,使用逐个字符比较,花比较大的功夫,得到很有限的AT指令结果。

最近接到任务,让我把原来工程师的单流工作模式,改成多流模式,又重新思考了一下解析方式。

注:单流说的是他直接用透传方式,省事。后来需求变化,要改成同时支持多个TCP连接、和IP应用的工作方式。

模组换成了SIM800C。

模组里面本来已经封装好了协议栈,我们用AT指令只是做一些控制,接收一些信息。

所做的工作:

1、把模组里面的状态信息,同步到单片机里面:MCU循环发送状态查询指令给SIM800C,然后解析得到的信息,存储在变量(一个大的结构体,所建立的数据模型)里面。

2、AT解析,使用sscanf,根据各个指令格式,写出解析格式控制字符串存储到数组中即可,使用一个thread去跑这个parser。

3、再用一个thread跑维护任务,主要就是根据模组状态,初始化模组,查询状态,发送TCP数据等等。。。

4、TCP接收等,可以使用回调,也可以FIFO等方式。

5、uart只有一个,然后有些时候(比如在TCP发送时)需要独占UART一段时间,这就有竞争,需要用锁,可以自己写个简单的,只有获得使用权的任务才能发送,不然就等到超时,返回失败。也可以用系统的互斥信号量(我不会用,不熟悉的不敢用)。


如果有更好的方式欢迎提出。

2018-05-18 17:00:31 qq_29762941 阅读数 1441
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

把下图中波特率改一下,如一开始是9600,改为115200,再送发AT指令.之后再用AT+UART=9600,8,1,0,0更改WIFI模块波特率即可。

2005-01-20 12:19:00 nicholas_dsj 阅读数 924
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏


  单片机和GSM引擎之间采用AT指令实现互相之间的通信,因此有必要了解一下AT指令的格式和几条常用的指令。更详细的资料可以参考GSM07.05GSM07.07规范。

  单片机发出的AT指令用来建立通信链路,AT指令集的命令格式帧都以AT开头,下面是几个常用的AT指令。

1.设置短消息中心

AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)

2.接收短消息

+CMTI“SM”X   (X表示接收短消息的SIM卡存储号码)

AT+CMGR=X回车  (X存储区读短消息)

AT+CMGD=X回车  (X存储区删除短消息)

3.发送短消息

AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)

AT+CMGS=“+8613xxxxxxxxx”回车

>输入短消息。Crtl+Z结束并发送。

4.重要的指令

ATZ;E 回车        Echo OFF

ATZ;E1回车       Echo ON

AT+CREG?回车  回答x(X=2脱网,X=1注册,X=0状态不明)

AT+COPS?回车 表示SIM卡是否被网络接受

AT+COPS=?回车 显示所有可用的网络。

 5.建立语音呼叫

AT+CREG?回车(是否网络注册)

ATD13xxxxxxxxx;回车(语音呼叫和数据呼叫建立的区别在于号码后所接的分号上)

6.改变并保存参数

AT+IPR=2400  回车(改变RS232口的速率至2400bps)

AT&W  回车 (保存已改参数)

7.输入PIN

AT+CPIN=“xxxx”

  通信链路建立以后,单片机就可以发出信息单元帧了,信息的帧格式如下:

    其中标志帧开始的帧头为十六进制的10H02H,标志信息结束的是10H03H,最后二位是数据部分按16位求和以后取模的结果,用做校验位。对于数据位,为了避免出现错误的结束标志,规定每出现一个10H码字以后,后面插入一个空字符00H。接收端如果收到信息以后,就要相应地去掉空字符。如果接收端收到的数据部分和BCS部分按照16位相加以后的结果不等于0,就表示传输出现错误,所收到的信息就要丢掉。

2019-08-25 22:29:26 weixin_45211835 阅读数 43
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

main.c

#include <reg52.h>


bit flagtxd=0;//发送单个字符成功标志
unsigned char rxdbyte=0;//接收变量


void Uart1_SendChar(unsigned char Udat)//发送单个字符函数
{
   flagtxd=0;
	SBUF=Udat;		//将要发送的数据放入串口数据缓冲区
	while(!flagtxd);		//等待发送完成
   	
}

void putchar(char c)
{

Uart1_SendChar(c);

}

void printf(unsigned char *p)//自编printf函数,非官方的那个函数
{
  while(*p!='\0')
  {
  putchar(*p++);

  }

}


void InitUART(unsigned int baud)//串口初始化

{

SCON = 0x50;	 //串口接收使能
TMOD&=0x0F;
TMOD|=0x20;
TH1=256-(11059200/12/32)/baud;
TL1=TH1;
ET1=0;
ES = 1;			 //串口中断使能
TR1 = 1;		 //定时器1使能

}


//毫秒延时函数

void delay_ms(unsigned int t)

{

unsigned char a,b;

while(t--)

{

for(b=102;b>0;b--)

for(a=3;a>0;a--);

}

}

void InitESP8266()//ESP8266初始化,延时时间是不合适的,你们自己调整一下
{
printf("AT\r\n");  //测试
        delayms(1200);         //适当延时,给wifi模块一点反应时间
       
        printf("AT+CWMODE=1\r\n");  //选择STA模式
	delayms(1200);

        printf("AT+RST\r\n");  //往串口发重启指令
	delayms(1200);         //适当延时,给wifi模块一点反应时间
 
	printf("AT+CWJAP=\"wifi\",\"123456\"\r\n");  //连接WIFI
	delayms(1200);
 
	printf("AT+CIPMUX=0\r\n");  //单通道模式
	delayms(1200);
	
	printf("AT+CIPSTART=\"TCP\",\"192.168.1.118\",6666\r\n");  //连接远程主机IP和端口号
	delayms(1200);
 
	printf("AT+CIPMODE=1\r\n");  //选择透传
	delayms(1200);
 
	printf("AT+CIPSEND\r\n");  //发送数据命令
	delayms(1200);

}

void main()

{

InitUART(9600);	//初始化串口
InitESP8266();

EA = 1;	 	//开总中断

while(1);

 
        
 
	


 


}


/*UART中断函数*/
void interruptUART() interrupt 4
{
if(RI)
 {
 RI=0;
 rxdbyte=SBUF;
 SBUF=rxdbyte;//将收到的数据回传回去,可以自己对返回数据做判断,执行动作
 }

if(TI)
 {
 TI=0;
 flagtxd=1;
 }
}

实用的AT指令

阅读数 1861

没有更多推荐了,返回首页