OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3398|回复: 1

TCP和与中心连接后,收发程序处理问题

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-5-7
在线时间
61 小时
发表于 2020-2-17 12:12:32 | 显示全部楼层 |阅读模式
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 ;
                }       
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165378
金钱
165378
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-2-18 00:55:19 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-14 00:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表