一线雷达问题解决方案

弄清一个概念:

雷达通信是TCP通信,雷达是服务器端,而我们编的程序是客户端。

我们与决策端计算机进行通信是UDP,我们这边也是客户端,决策组那边是服务器端。

也就是说,我们编程的思路是,TCP客户端里面嵌入了UDP客户端。

一、编程的总体思路如下:

1、先雷达服务器端先connect,然后send,向雷达发送命令。

    对于此,要涉及到一个概念:

雷达的数据的接收模式,我们可以向雷达发送三种命令,一种是单次测量:

单次测量:发送指令后 LMS 会返回当前 LMS 的测量数据

命令:sRN LMDscandata

返回的数据格式如下:

image

目前我用的就是这种解析模式。

 

连续测量:发送指令后,LMS 会实时返回其测量数据

命令:sEN LMDscandata 1

image

 

连续测量停止:发送指令后,LMS 停止向外发送测量数据

命令:sEN LMDscandata 0

 

每次都执行一遍TCP的客户端程序,有点麻烦,程序运行效率不太高。这点比较烦。

2、在第一步成功的条件下,我们就可以采集数据了。

     这里有个很重要的一个地方需要大家注意,我要是没搞错的话,雷达服务器端,应该用的是一个可变的8位无符号整型来向我们发送数据的,也就是说,数据量 8*381 + 25*8 =   3248 byte,也就是说,我们接收端开辟的缓冲数据,必须大于这个数字,要记住这个值是一直在变动的。一定要开辟足够大的空间,不然数据量无法全部收满,不好整。

3、对接收到的数据,进行解析,根据数据格式一步步解析。

     这部分没啥可讲的,重点就是一些数组、字符串、字符数组、动态开辟字符串等的灵活运用。

4、对解析出来的数据,进行处理,并通过UDP传至决策组。

     这部分和之前的程序一样。不赘述。

 

二、编程的过程中,涉及到的一些基础点:

1、sendstr头尾各加上0x02和0x03

  用字符数组实现:

  重新定义dst[18] = {0,}  //初始化的一种方式,这样剩下的其他的都自动初始化为0了。

    char SendStr[16] = "sRN LMDscandata";

  //将sendstr头尾各加上0x02和0x03
    char dst[18]={0,};
    int i = 0;
    dst[0] = 0x02;
    for( i=0; i < 15;i++) 
        dst[i+1]=SendStr[i]; 
    dst[16] = 0x03;
    dst[17] = '\0';
  
  char SendStr[16] = "sRN LMDscandata";
  char s[100]={0,};
  sprintf(s,"%c%s%c",0x02,SendStr,0x03);
  printf("%s",s);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  char SendStr[16] = "sRN LMDscandata";
  string s;
  for (int i= 0;i<16; i++)
  {
      s+=SendStr[i];
  }
 
 
  char SendStr[16] = {0,};
  string s = "sRN LMDscandata";

  for (int i= 0;i<15; i++) //i只在这个for循环里面有效
  {
      SendStr[i]=s[i];
  }
  SendStr[16] = '\0';
 

指针变量存储在栈中,使用&运算后得到的是指针变量的地址.
数组名是个标签,没地方存放,没有地址,但在很多情况下取数组名地址的结果是仍然是其本身。可是我们应该不提倡对数组名取地址.

对于数组我们提倡用以下方式:

char szBuffer[4096] = {0,};

当然这种方式也是可以的,但不提倡

int szBuffer[4096]; 
//memset(szBuffer,0,sizeof(szBuffer));
ZeroMemory(szBuffer,sizeof(szBuffer));

对于结构体,我们提倡用下面的一种方式

Matrix matrix;

memset(&matrix,0,sizeof(matrix));

image


 

4、字符数组与字符指针变量的区别:

 
 
 
 
 
 
 
 
 //此代码作用是从szbuffer中截取3个字符,这个其实是雷达的接收到的非零元素的个数,   
 //s[3]='\0';是因为这是一个字符串而不是字符数组,字符数组后面是没有\0的。
//最后,通过字符串转换函数将s字符串转为16进制无符号长整型,又由于tx是十进制的
//系统又强制转为10进制数,string  to  unsigned long ;
      char s[4]={0,};
      unsigned long tx;
      for(int i=0; i<3; i++)
         s[i] = szBuffer[dCnt+i];
        s[3] = '\0';
tx = strtoul(s, 0, 16);//将字符串转换成无符号长整型数,16进制。
 
 
 
 
 
 
 
http://baike.baidu.com/view/1364018.htm

%x表示已十六进制格式输出。

    int a;
    char s[]="17D";
    sscanf(s,"%x",&a);
 
   sscanf函数原型:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
   sscanf() - 从一个字符串中读进与指定格式相符的数据
 
   sprintf 与 sscanf 强化    

   

 

6、可变数组传输与字符数组传输的比较

               UDPClient(buffer,len);


7、利用字符串函数实现copy功能,其中另一个字符数组的长度是不确定的

 
 
 
 
     int count = 4;
    char OneDIST[4]={'a','b','c',};
    OneDIST[3] = '\0';
    char *copyDist =new char[count];
     strcpy(copyDist,OneDIST);//用字符串复制函数也是可以的
    //char copy[count]={0,};
    //memcpy(copyDist,OneDIST,count);//这里用内存复制的形式将OneDIST字符串里面的东西全部给了copyDist
    //相当于copyDist也是一个字符串,然后,通过下面的字符串操作函数,解出copyDist所代表的值。
    int x = strtoul(copyDist, 0, 16);
 

当然,除了strcpy函数之外,我们还有strcmp等

 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/zhuxuekui/p/3636263.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值