初级会员

- 积分
- 123
- 金钱
- 123
- 注册时间
- 2019-5-7
- 在线时间
- 61 小时
|
1金钱
STM32+EC20与中心成功建立TCP连接后,发送与连接程序应该怎么写,请教一个老大。目前程序发送流程功能码03先发送-03接收成功再发送功能01,但03接收过程有延时不知道程序应该如何处理,请各位老大赐教,最好有参考程序。代码如下:
问题判断:
+QIOPEN: 0,0
open tcp/udp finished
connect to server finished
conn ok
GNM...
GNM_03...send_OKOKOK
GNM_03...send_OKOK
GNM_03...send_OK
GNM_03...receive..
creat_XT...receive_DATA_ERROR
GNM_03...send_OKOKOK
GNM_03...send_OKOK
GNM_03...receive..
creat_XT...receive_DATA_ERROR
GNM_03...send_OKOKOK
GNM_03...send_OKOK
GNM_03...receive..
GNM_03...receive_DATA_OK
GNM_01...send_OKOKOK
GNM_01...send_OKOK
GNM_ERROR
原代码
/*************************************** 功能码01发送数据通信 发送数据 *****************************************/
static void GNM_01_send()
{
unsigned int i ,j;
union U_float uf1,uf2;
union U_long ul1,ul2;
char *ret_val = NULL;
char *ret_val1 = NULL;
u8 S1[2]={0xFE,0x01}; //注册包1
u8 S2[4]={0x00,0x00,0x00,0x01}; //注册包2
if (current_status != TCP_IP_OK) // 如果协议没有连接成功直接返回
return ;
ibusy = 1;
clear_buf_uart2();
#if 1
send_string_uart2(GPRS_SEND_DATA); //发送数据命令 注意没长度限制
while(1)
{
ret_val = strstr((const char*)buf_uart2.buf,">"); //检测4G模块返回>
if(ret_val)
{
Send_Data_uart2(S1,2); //发送包头和功能码
Send_Data_uart2(S2,4); //发送11位手册号
Send_Data_uart2(NewDatetime,8); //发送当前数据时间
for( j = 0 ;j < 17 ; j ++) //发送前17个浮点数据
{
uf1.f = NewData[j];
for(i=0;i<MAX_LENTH;i++)
{
uf2.s[i] = uf1.s[i];
send_data_uart2(uf2.s[i]);
}
}
ul1.l = NewDataState; //发送最后一个流量计状态数据
for(i=0;i<MAX_LENTH;i++)
{
ul2.s[i] = ul1.s[i];
send_data_uart2(ul2.s[i]);
}
send_data_uart2(0x1A); //SEND OK //没长度限制一定要用1A表示结束
break ;
}
}
PUT("GNM_01...send_OKOKOK\r\n");
while(1)
{
ret_val1 = strstr((const char*)buf_uart2.buf,"SEND OK");
if(ret_val1)
{
clear_buf_uart2();
PUT("GNM_01...send_OKOK\r\n");
gnm_status = GNM_01_R;
break ;
}
}
#endif
ibusy = 0;
}
/*************************************** 功能码01发送数据通信 接收数据 *****************************************/
static void GNM_01_receive()
{
char *ret_val = NULL;
ret_val = strstr((const char*)buf_uart2.buf,"+QIURC: \"recv\",0,14"); //建立连接成功了
if(ret_val)
{
if(buf_uart2.buf[24]== '\x021' )
{
PUT("GNM_01...receive_OK\r\n");
gnm_status = GNM_OK;
}
else
{
PUT("GNM_01...receive_DATA_ERROR\r\n");
}
}
}
/*************************************** 功能码03授时通信 发送数据 *****************************************/
static void GNM_03_send()
{
char *ret_val = NULL;
char *ret_val1 = NULL;
u8 S1[2]={0xFE,0x03}; //注册包1
u8 S2[4]={0x00,0x00,0x00,0x01}; //注册包2
if (current_status != TCP_IP_OK) // 如果协议没有连接成功直接返回
return ;
ibusy = 1;
clear_buf_uart2();
#if 1
send_string_uart2(GPRS_SEND_DATA); //发送数据命令 注意没长度限制
delay_GSM(500);
Send_Data_uart2(S1,2); //发送包头和功能码
Send_Data_uart2(S2,4); //发送11位手册号
send_data_uart2(0x1A); //SEND OK //没长度限制一定要用1A表示结束
PUT("GNM_03...send_OKOKOK\r\n");
while(1)
{
ret_val1 = strstr((const char*)buf_uart2.buf,"SEND OK");
if(ret_val1)
{
clear_buf_uart2();
PUT("GNM_03...send_OKOK\r\n");
gnm_status = GNM_03_R;
return ;
}
}
#endif
ibusy = 0;
}
/*************************************** 功能码03授时通信 接收数据 *****************************************/
static void GNM_03_receive()
{
char *ret_val = NULL;
delay_GSM(2000);
ret_val = strstr((const char*)buf_uart2.buf,"+QIURC: \"recv\",0,14"); //建立连接成功了
//PUT(buf_uart2.buf);//打印接收到数据长度
if(ret_val)
{
// PUT("creat_XT...receive\r\n");
// PUT(buf_uart2.buf);
// send_data_uart1(buf_uart2.buf[14]); //将接收到信息发送到串口3
// PUT("GGGG");
// a[0] = strlen(buf_uart2.buf);
// Send_Data_uart1(a,1);
// PUT("GGGG\r\n");
// PUT("creat_XT...receive_OK\r\n");
if(buf_uart2.buf[24]== '\x023' )
{
u8 R_datetime[8];
PUT("GNM_03...receive_DATA_OK\r\n");
DSC_conn_ok =1 ;
ibusy = 0;
gnm_status = GNM_01_S;
R_datetime[0]=buf_uart2.buf[29];
R_datetime[1]=buf_uart2.buf[30];
R_datetime[2]=buf_uart2.buf[31];
R_datetime[3]=buf_uart2.buf[32];
R_datetime[4]=buf_uart2.buf[33];
R_datetime[5]=buf_uart2.buf[34];
R_datetime[6]=buf_uart2.buf[35];
RTC_SetDataTime(R_datetime);
}
else
{
PUT("creat_XT...receive_DATA_ERROR\r\n");
GNM_03_send();
}
}
}
/*************************************** 功能码 通信 *****************************************/
void GNM()
{
if(!g_gprs_conn_ok)
return ;
PUT("GNM...\r\n");
gnm_status = GNM_03_S;
while(1)
{
err ++;
if(err>MAX_ERROR_COUNT)
{
err = 0 ;
PUT("GNM_ERROR\r\n");
break;
}
switch(gnm_status)
{
case GNM_01_S:
GNM_01_send();
break ;
case GNM_01_R:
GNM_01_receive();
break ;
case GNM_02_S:
clear_buf_uart2();
break ;
case GNM_02_R:
break ;
case GNM_03_S:
GNM_03_send(); //发送功能码03,与中心校时
PUT("GNM_03...send_OK\r\n");
break ;
case GNM_03_R:
PUT("GNM_03...receive..\r\n");
GNM_03_receive(); //接收功能码03,修证MCU时间
break ;
case GNM_OK:
clear_buf_uart2();
return ;
case GNM_NO:
clear_buf_uart2();
return ;
default:
clear_buf_uart2();
return ;
}
}
}
|
|