收藏 分销(赏)

C51单片机控制sim900a收发信息c语言程序.docx

上传人:pc****0 文档编号:5959519 上传时间:2024-11-24 格式:DOCX 页数:14 大小:18.62KB
下载 相关 举报
C51单片机控制sim900a收发信息c语言程序.docx_第1页
第1页 / 共14页
C51单片机控制sim900a收发信息c语言程序.docx_第2页
第2页 / 共14页
C51单片机控制sim900a收发信息c语言程序.docx_第3页
第3页 / 共14页
C51单片机控制sim900a收发信息c语言程序.docx_第4页
第4页 / 共14页
C51单片机控制sim900a收发信息c语言程序.docx_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、#include #include #include STC12C5A60S2.h/! 服务器IP地址与端口号,注意,用户需要将此IP替换为/! 自己服务器的公网IP地址#define TCPIP_SERVER_IPADDR 115.171.51.103#define TCPIP_SERVER_PORT 8088/! 串口发送与接收缓冲区大小#define TTY_MAX_BUFFER_SIZE 256/! 串口发送与接收缓冲区char ttyBufferTTY_MAX_BUFFER_SIZE;/! TCPIP发送与接收缓冲区大小#define TCPIP_MAX_BUFFER_SIZE 25

2、6 /! TCPIP发送与接收缓冲区char tcpipBufferTCPIP_MAX_BUFFER_SIZE;/! 串口0初始化函数, 此串口用作接收终端控制命令/! 晶振频率:22.1184MHz/! 串口0波特率:9600void Uart0_Init(void) /9600bps22.1184MHz PCON |= 0x80; /使能波特率倍速位SMOD SCON = 0x50; /8位数据,可变波特率 AUXR |= 0x40; /定时器1时钟为Fosc,即1T AUXR &= 0xfe; /串口1选择定时器1为波特率发生器 TMOD &= 0x0f; /清除定时器1模式位 TMOD

3、 |= 0x20; /设定定时器1为8位自动重装方式 TL1 = 0x70; /设定定时初值 TH1 = 0x70; /设定定时器重装值 ET1 = 0; /禁止定时器1中断 TR1 = 1; /启动定时器1/! 串口0字符串输出函数/! 参数说明:pString为字符串缓冲区首地址void Uart0_PutString(char* pString) unsigned short i = 0; while(pStringi) SBUF = pStringi+; while(!TI); TI = 0; /! 串口0字符串读取函数, 获取一行数据, 遇到换行符为止/! 参数说明:pBuffer为

4、缓冲区首地址, nBufferLen为缓冲区大小, nTimeOut为超时时间/! 如果nTimeOut=0, 那么函数会阻塞, 直到缓冲区满或遇到换行符unsigned short Uart0_GetALine(char* pBuffer, unsigned char nBufferLen, unsigned char nTimeOut) char ch = 0; unsigned int i = 0, j = 0, k = 0; k = 20000*nTimeOut; for(i = 0, j = 0; i nBufferLen; i+) while(1) if(RI) RI = 0; /

5、清除接收完成标志 pBufferi = SBUF; /! 回显给终端显示 SBUF = pBufferi; while(!TI); TI = 0; if(pBufferi = 0x0d) pBufferi = 0x00; return i; break; else if(nTimeOut = 0) continue; else j+; if(j = k) break; return i;/! 串口1初始化函数, 此串口用作控制GSM模块/! 晶振频率:22.1184MHz/! 串口1波特率:9600void Uart1_Init(void) /9600bps22.1184MHz AUXR |=

6、 0x08; /使能波特率倍速位S2SMOD S2CON = 0x50; /8位数据,可变波特率 BRT = 0x70; /设定独立波特率发生器重装值 AUXR |= 0x04; /独立波特率发生器时钟为Fosc,即1T AUXR |= 0x10; /启动独立波特率发生器/! 串口1字符串输出函数/! 参数说明:pString为字符串缓冲区首地址/! 备注:此函数一方面向串口1发送数据,/! 另一方面也向串口0发送数据,/! 目的是为了方便调试void Uart1_PutString(char* pString) unsigned char i = 0; /! 向串口1写数据 i = 0; w

7、hile(pStringi) /! 向串口0写数据,目的是方便调试 SBUF = pStringi; while(!TI); TI = 0; S2BUF = pStringi+; while(!(S2CON&S2TI); S2CON &= S2TI; /* * func Uart1_GetString * author SwanTech (2011/12/14) * param pBuffer 缓冲区地址 * param nBufferLen 缓冲区长度 * param nTimeOut 读取返回数据的超时时间 * return unsigned short 成功: 返回接收到的字节数. 失败

8、: 返回-1 * remark 注意nTimeOut超时时间从接收到第一个字符开始计数 */unsigned short Uart1_GetString(char* pBuffer, unsigned short nBufferLen, unsigned short nTimeOut) unsigned short i = 0, j = 0, k = 0; /! 此函数固定的超时时间,也就是说如果根本就 /! 没有应答数据时,函数经过这个固定超时时间会返回 const unsigned short nFixedTimeout = 65500; for(i = 0; (i nFixedTimeo

9、ut & k = 0); i+) for(j = 0, k = 0; j );/* * brief TCPIP协议栈配置 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_Config(void) /! 下面是配置过程 /! AT Uart1_PutString(ATx0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 60000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:fail

10、ed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:AT Command Exec failed.nr); return -1; /! ATE0 关闭回显 Uart1_PutString(ATE0x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Confi

11、g:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:AT Command Exec failed.nr); return -1; /! AT+CIPSHUT 防止上次使用过程中没有关闭网络功能,尝试关闭网络功能 /! 注意,此条命令执行时间较长,大概2秒左右才可以关闭网络功能 /! 所以等待应答的时间较长 Uart1_PutString(AT+CIPSHUTx0D

12、x0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, SHUT OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:关闭网络功能失败.nr); return -1; /! AT+CIPMUX 设置为单连接模式 U

13、art1_PutString(AT+CIPMUX=0x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:设置为单连接模式失败.nr); return -

14、1; /! AT+CIPRXGET 配置为手动获取网络数据 Uart1_PutString(AT+CIPRXGET=1x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPI

15、P_Config:配置为手动获取网络数据失败.nr); return -1; /! AT+CIPQRCLOSE 配置为加速远程断开连接 Uart1_PutString(AT+CIPQRCLOSE=1x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返

16、回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:配置为加速远程断开连接失败.nr); return -1; /! AT+CIPMODE 配置为非透明传输模式 Uart1_PutString(AT+CIPMODE=0x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer,

17、 OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:配置为非透明传输模式失败.nr); return -1; return 0;/* * brief 连接服务器 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_Connect(void) /! AT+CIPSTART 准备连接服务器 sprintf(ttyBuffer, AT+CIPSTART=TCP,%s,%sx0Dx0A, TCPIP_SERVER_IPAD

18、DR, TCPIP_SERVER_PORT); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Connect:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Connect:准备连接服

19、务器失败.nr); return -1; /! 判断是否连接已经建立 if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Connect:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, CONNECT OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Connect:连接服务器失败.nr); r

20、eturn -1; return 0;/* * brief 断开与服务器的连接 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_DisConnect(void) /! AT+CIPCLOSE 断开连接 sprintf(ttyBuffer, AT+CIPCLOSE=1x0Dx0A); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_

21、DisConnect:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, CLOSE OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_DisConnect:断开连接失败.nr); return -1; return 0;/* * brief 关闭网络功能 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_NETShut(void) /! AT+CIPSHUT

22、 关闭网络功能 sprintf(ttyBuffer, AT+CIPSHUTx0Dx0A); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_NETShut:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, SHUT OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(S

23、wanTech_TCPIP_NETShut:关闭网络功能失败.nr); return -1; return 0;/* * brief SIM900_TCPIP数据发送函数 * author SwanTech (2011/12/12) * param pBuffer: 数据缓冲区地址 * param nBufferLen: 数据长度 */short SwanTech_TCPIP_Send(char* pBuffer, unsigned short nBufferLen) /! 请求发送数据 /! AT+CIPSEND sprintf(ttyBuffer, AT+CIPSEND=%dx0Dx0A,

24、 nBufferLen); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Send:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, ) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Send:请求发送数据失败.nr); return -1

25、; /! 发送数据 Uart1_PutString(pBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Send:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, SEND OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Send:发送数据失败.nr); return -1;

26、 return nBufferLen;/* * brief SIM900_TCPIP数据接收函数 * author SwanTech (2011/12/12) * param pBuffer: 数据缓冲区地址 * param nBufferLen: 缓冲区大小 */short SwanTech_TCPIP_Recv(char* pBuffer, unsigned short nBufferLen) /! 判断应答数据到来标志+CIPRXGET:1 if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 10000) = 0) Uart0_PutSt

27、ring(SwanTech_TCPIP_Recv:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, +CIPRXGET:1) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Recv:获取应答数据标志失败.nr); return -1; /! 读取应答数据 Uart1_PutString(AT+CIPRXGET=2,128x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZ

28、E, 30000) = 0) Uart0_PutString(SwanTech_TCPIP_Recv:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Recv:读取应答数据失败.nr); return -1; return 1;void SwanTech_CommandMonitor(void) unsigned char bFinishConfig = 0; unsigned

29、 char bFinishConnect = 0; char buffer3 = 0; while(1) Uart0_GetALine(buffer, 2, 0); /! 如果连续收到2个0x7F,那么认为是STC-ISP正在请求下载程序 /! 这时候启动系统复位,从ISP监控程序重新引导 if(buffer0 = 0x7F & buffer1 = 0x7F) IAP_CONTR = 0x60; Uart0_PutString(nr+-+nr); if(buffer0 = 1) if(SwanTech_TCPIP_Config() = -1) bFinishConfig = 0; /! 配置失

30、败的标志 Uart0_PutString(nr+开启TCPIP网络功能失败!nr); else bFinishConfig = 1; /! 配置成功的标志 Uart0_PutString(nr+开启TCPIP网络功能成功!nr); else if(buffer0 = 2) if(bFinishConfig = 0) /! 如果没有开启TCPIP网络功能,那么返回失败 Uart0_PutString(nr+请先开启TCPIP网络功能!nr); else if(SwanTech_TCPIP_Connect() = -1) bFinishConnect = 0; /! 连接失败的标志 Uart0_P

31、utString(nr+连接服务器失败!nr); else bFinishConnect = 1; /! 连接成功的标志 Uart0_PutString(nr+连接服务器成功!nr); else if(buffer0 = 3) strcpy(tcpipBuffer, 鸿鹄电子科技. Http:/ if(bFinishConnect = 0) /! 如果成功连接到服务器,那么返回失败 Uart0_PutString(nr+请先连接服务器!nr); else if(SwanTech_TCPIP_Send(tcpipBuffer, strlen(tcpipBuffer) = -1) Uart0_Pu

32、tString(nr+发送数据失败!nr); else Uart0_PutString(nr+发送数据成功!nr); else if(buffer0 = 4) strcpy(tcpipBuffer, 鸿鹄电子科技. Http:/ if(bFinishConnect = 0) /! 如果成功连接到服务器,那么返回失败 Uart0_PutString(nr+请先连接服务器!nr); else if(SwanTech_TCPIP_Send(tcpipBuffer, strlen(tcpipBuffer) = -1) Uart0_PutString(nr+发送数据失败!nr); else Uart0_

33、PutString(nr+发送数据成功!nr); Uart0_PutString(nr+等待服务器应答.nr); if(SwanTech_TCPIP_Recv(tcpipBuffer, TCPIP_MAX_BUFFER_SIZE) = -1) Uart0_PutString(nr+接收应答数据失败!nr); else Uart0_PutString(nr+接收应答数据成功!nr); else if(buffer0 = 5) if(bFinishConnect = 0) Uart0_PutString(nr+连接还没有建立,请先建立与服务器之间的连接!nr); else if(SwanTech_

34、TCPIP_DisConnect() = -1) Uart0_PutString(nr+断开与服务器之间的连接失败!nr); else Uart0_PutString(nr+断开与服务器之间的连接成功!nr); else if(buffer0 = 6) if(SwanTech_TCPIP_NETShut() = -1) Uart0_PutString(nr+关闭TCPIP网络功能失败!nr); else Uart0_PutString(nr+关闭TCPIP网络功能成功!nr); SwanTech_CommandDisplay(); void main(void) Uart0_Init(); Uart1_Init(); while(1) if(RI) RI = 0; SwanTech_LogoDisplay(); SwanTech_CommandDisplay(); break; while(1) SwanTech_CommandMonitor();

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服