赞
踩
采用一个 IAP15W4K58S4,也就是一个STC15W4K58S4的单片机和SIM800C进行连接。使用一个上网卡,实现物联网操作。硬件连接非常简单,可以非常容易的实现,测试也非常简单,将单片机设置2个串口,一个串口做调试用,另一个串口是和SIM800C进行连接。这里有一个比较奇怪的现象,我在单片机中设置的波特率是9600,一般速率会减半,所以在单片机中将与SIM800C实现串口通讯的波特率设置为19200,这样就可以实现通讯了。
要实现一些简单的计算机指令还是需要费一些周折的,要使用诸如printf命令和scanf命令都要费一些功夫。STC15系列的软件还是不如NANO等Arduino计算机开发的抽象化,还是比较底层就可以开发应用的。在这里说一下要使用printf的话,要在程序中修改putchar这个函数,修改的方法如下:
void putchar(char c){
ES = 0;
SBUF = c;
while(TI==0);
TI = 0;
ES = 1;
}
在程序中将原来的库函数中的putchar去除就可以正常的使用printf的函数了。
系统上电启动后,首先我们是要给SIM800C发送一个AT命令,来测试SIM800C是否是激活的。当激活时,SIM800C会返回一个OK的命令。再就是要发送一个AT+CSQ命令,让SIM800检测网络信号是否正常。发送了命令后,要对返回的命令进行读取和分析。
发送指令就是一般的向串口发送字符串指令:
if (cStep == 0)
{
cStep = 1; // Initialize Step: AT
PrintString2("AT\r");
printf("The Step number = %d\r\n", cStep);
iSendFlag = 1;
}
当SIM800C得到AT命令,如果回显设置的是ATE1,则回显AT,如果正常,就返回OK,如果不正常或者是没有连接,返回为空。对返回值的检测要注意一般会采用strstr函数来得到分字符串,返回的例程如下:
printf("%s", hubSIMChar);
desstr = strstr(hubSIMChar, "OK");
if (strncmp(desstr, "OK", 2) == 0)
{
printf("SIM800C is OK\r\n");
cStep += 1;
}
再这里的字符串比较用到了strncmp函数。如果直接用strcmp函数就不能正常的运行。而且要注意,相等的条件是strncmp的结果是0表明两个分字符串相等。
当发送AT命令后,返回OK说明SIM800C可以正常工作了,现在发送这个AT+CSQ命令来测试网络连接信号是否正常。
PrintString2("AT+CSQ\r");
iSendFlag = 2;
cStep = 3;
发送完命令后等待SIM800C来返回。
printf("%s", hubSIMChar);
desstr = strstr(hubSIMChar, "+CSQ: ");
sscanf(desstr, "%s %d,%d", str1, &icsq1,&icsq2);
printf("The mobile signal is:%d,%d\r\n", icsq1, icsq2);
iSendFlag = 0;
if (icsq1 < 10)
printf("The mobile signal is too low\r\n");
再计算机上运行结果如下:
The step number = 3
AT+CSQ
+CSQ: 18,5
OK
The mobile signal is: 18,5
要使用单片机与AT命令打交道,就要熟练的掌握字符串处理,用好字符串的函数非常重要。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。