某型雷达的报文收发实录

某型雷达的报文收发实录

前言:工作中需要与某型激光雷达进行通讯,读写报文解析出相应的角度、位置。在目前的工作中,切实遇到的问题是报文的收发,这里记录之。(以下内容尚未进过实践检验2020-6-20)

​ 激光雷达的报文的接收,使用的API为winsock2的recv()函数。遇到的最主要问题是报文格式→代码中的接收方法→应当被处理的格式。涉及的主要知识出乎意料的简单——char,unsigned char;

bool SendTelex(const uchar * const Telex)
{
    //记录报文长度;
    int t = strlen(Telex);
    //发送报文;
    int e = Send(句柄, static_cast(Telex), TelexLen);
    //检查是否发送成功;
    if(SOCKET_ERROR == e)
    {
        return false
    }
    return true;
}
/*因为种种原因,上述代码进过了极大的简化处理*/

​ 上述的代码只涉及到报文的发,不过问题不大,我们这里主要聚焦其中的“格式”问题。

知识点1:const uchar * const Telex
为什么要用const,首先必须明白“*”左右的const各有什么作用。《effective C++》一书中讲的简单实用:左边的const表示指针所指之物不可改变;右边的const表示指针本身不可改变。
我姑且在这里做一回汤师爷,给好好解释解释这段话。指针真的很不好理解,这里就叫他“地址”。这里Telex本身是一个地址变量,它存储了一个地址a。每个地址里面自然会存储一些内容,Telex里存储的是a,假设a里存储的是0x00。结合这样一个前提,在此理解上面那段话:

左边的const:a里存储的0x00不能被改变;
右边的const:Telex里存储的a不能被改变;

(个人感觉解释的比较直观)这里采用了const,就是告诉使用者 “在这里发个报文而已,你不能做任何改变”。然而最终使用的是const uchar * telex,因为API send(),接收的参数就是const char*,很显然,不能将一个const值传给非const值。
补充一个tips

std::cout<

知识点2:Send(句柄, static_cast(Telex), TelexLen)
(一笔带过:static_cast<>相对于直接用char *强制转换更加安全)
因为send() API接收的参数是char *,所以这里用上强制转换。那么为什么不从一开始就用char *呢?
注意,激光雷达发过来的就是一个一个的字节,用char *还是unsigned char*接收都是可以的,二者的存储方式一般无二。但是,正如百度百科对两者区别的叙述,在二者向int或者unsigned int 进行强制类型转换时,差别就出来了:

char 是有符号的,unsigned char 是无符号的。当二者同时存储0xFF,前者强转后是-1,而后者是255.在强制转换的过程中,char 转int,int 的高24位必须补1,而unsigned char转int ,int 高位补0.差别就在这里。

​ 激光雷达的x坐标信息是四个字节,范围:0x F0 00 00 00 ~ 0x 0F FF FF FF。x的值是有正负的,但是每个字节是没有正负之分的,需要再接收后,人工的根据高位进行数据转换(取反加一,负数)。

结束。欢迎大家批评指正。

你可能感兴趣的:(C++/c)