新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2020-9-11
- 在线时间
- 7 小时
|
5金钱
最近买了一个BC28想做一个智慧路灯,已经可以向服务器发送数据了,但是,测试服务器发的数据接收不到,而且每次发送数据超过两个的时候就会自动和服务器断开连接,作为新手,真的好焦虑,不知道是什么原因,求大佬告知。
代码如下:
#include "bc28.h"
#include "string.h"
#include "usart.h"
#include "wdg.h"
#include "led.h"
char *strx,*extstrx;
extern char RxBuffer[100],RxCounter;
BC28 BC28_Status;
unsigned char socketnum=0;//当前的socket号码
void Clear_Buffer(void)//清空缓存
{
u8 i;
Uart3_SendStr(RxBuffer);
for(i=0;i<100;i++)
RxBuffer[i]=0;//缓存
RxCounter=0;
IWDG_Feed();//喂狗
}
void BC28_Init(void)
{
printf("AT\r\n");
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
Clear_Buffer();
while(strx==NULL)
{
Clear_Buffer();
printf("AT\r\n");
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
}
printf("AT+CFUN=1\r\n");//获取卡号,类似是否存在卡的意思,比较重要。
delay_ms(300);
printf("AT+CIMI\r\n");//获取卡号,类似是否存在卡的意思,比较重要。
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"460");//返460,表明识别到卡了
Clear_Buffer();
while(strx==NULL)
{
Clear_Buffer();
printf("AT+CIMI\r\n");//获取卡号,类似是否存在卡的意思,比较重要。
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"460");//返回OK,说明卡是存在的
}
printf("AT+CGATT=1\r\n");//激活网络,PDP
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返OK
Clear_Buffer();
printf("AT+CGATT?\r\n");//查询激活状态
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"+CGATT:1");//返1
Clear_Buffer();
while(strx==NULL)
{
Clear_Buffer();
printf("AT+CGATT?\r\n");//获取激活状态
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"+CGATT:1");//返回1,表明注网成功
}
printf("AT+CSQ\r\n");//查看获取CSQ值
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"+CSQ");//返回CSQ
if(strx)
{
BC28_Status.CSQ=(strx[7]-0x30)*10+(strx[8]-0x30);//获取CSQ
if((BC28_Status.CSQ==99)||((strx[7]-0x30)==0))//说明扫网失败
{
while(1)
{
BC28_Status.netstatus=0;
Uart3_SendStr("信号搜索失败,请查看原因!\r\n");
RESET=1;//拉低
delay_ms(300);
delay_ms(300);
RESET=0;//复位模块
delay_ms(300);//没有信号就复位
}
}
else
{
BC28_Status.netstatus=1;
}
}
Clear_Buffer();
}
/*void BC28_CreateUDPSokcet(void)//创建sokcet
{
u8 i;
for(i=0;i<5;i++)
{
printf("AT+NSOCL=%c\r\n",i+0x30);//关闭上一次socekt连接
delay_ms(300);
}
Clear_Buffer();
printf("AT+NSOCR=DGRAM,17,60000,1\r\n");//开启SOCKET连接
delay_ms(300);
socketnum=RxBuffer[2];//获取当前的socket号码
}*/
void BC28_CreateTCPSokcet(void)//创建sokcet
{
uint8_t i;
for(i=0;i<5;i++)
{
printf("AT+NSOCL=%c\r\n",i+0x30);//关闭socekt连接,主要是需要关闭上次的连接,如果用户选择不关闭连接,再重新再同一个端口建立SOCKET就会报错
delay_ms(300);
}
Clear_Buffer();
// printf("AT+CSCON?\r\n");
printf("AT+NSOCR=STREAM,6,60000,1\r\n"); //创建TCP SOCKET
delay_ms(300);
socketnum=RxBuffer[2];//获取当前的socket号码
printf("AT+NSOCO=%c,118.31.54.195,7788\r\n",socketnum);//连接服务器
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
while(strx==NULL)
{
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
}
Clear_Buffer();
// return socketnum;
}
//数据发送函数
/*void BC28_UDPSend(uint8_t *len,uint8_t *data)
{
printf("AT+NSOST=%c,118.31.54.195,7889,%s,%s\r\n",socketnum,len,data);//发送0socketIP和端口后面跟对应数据长度以及数据,
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
while(strx==NULL)
{
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
}
Clear_Buffer();
}*/
//数据发送函数
void BC28_TCPSend(uint8_t *len,uint8_t *data)
{
printf("AT+NSOSD=%c,%s,%s\r\n", socketnum,len,data);//发送数据,字符
delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
while(strx==NULL)
{
strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK
}
Clear_Buffer();
}
void BC28_RECData(void)
{
// char i;
strx=strstr((const char*)RxBuffer,(const char*)"+QSONMI");//返回+QSONMI,表明接收到TCP服务器发回的数据
delay_ms(300);
Clear_Buffer();
while(strx)
{
printf("AT+NSORF=%c,%s\r\n",BC28_Status.Socketnum,BC28_Status..recdata[10]);
strx=strstr((const char*)RxBuffer,(const char*)"OK");
}
Clear_Buffer();
}
|
|