STC15单片机使用AT命令的C语言编程

系统配置

采用一个 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之间的交互

系统上电启动后,首先我们是要给SIM800C发送一个AT命令,来测试SIM800C是否是激活的。当激活时,SIM800C会返回一个OK的命令。再就是要发送一个AT+CSQ命令,让SIM800检测网络信号是否正常。发送了命令后,要对返回的命令进行读取和分析。

AT命令的发送与读取

发送指令就是一般的向串口发送字符串指令:

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+CSQ发送命令和读取命令

当发送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命令打交道,就要熟练的掌握字符串处理,用好字符串的函数非常重要。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页