大数跨境
0
0

【KW 10】六维力传感器(上位机解析程序编写)

【KW 10】六维力传感器(上位机解析程序编写) 坤维科技
2022-12-01
0
导读:下期预告:六维联合加载标定及检测设备介绍


本篇文章,我将为朋友们介绍上位机接收程序的编写,包括数据的接收和数据的解析

C++串口接收程序

这张图是用C++编写的一个串口接收程序,程序一共138行。我以这个程序为例,讲解一下六维力传感器接收程序的编写。

其实使用程序接收传感器的数据,主要就三个步骤:

第一步:打开端口,如果是串口的话,就打开串口设备;

第二步:发送查询命令;

第三步:接收数据和数据解析。


Step 1:打开端口



这个程序的13到24行就是打开一个串口,windows和linux把标准串口设备都认为是一个文件,所以打开串口的程序使用的是CreateFile函数,函数的参数是设置串口编号和读写权限等控制字,这里面需要注意一下串口的编号,windows系统下在写入的编号大于10的时候,COM10的字符串前面需要加入几个特定字符,否则系统无法找到这个串口。CreateFile函数的返回值是一个句柄,20行是判断这个句柄是否有效。


程序25行到39行是对打开的串口进行设置,比如设置缓冲区大小和超时,当然还要设置串口的基本属性,比如波特率是460800,数据位8,校验位无,停止位1。到这里,我们已经完成了程序的第一步,就是正确打开了一个串口。

Step 2:发送查询命令


程序的第二步任务是写入查询命令。

在程序中是接下来的第41行到49行,主要是声明了一个字符数组,写入四个字节 48 AA 0D 0A的查询命令,然后用WriteFile发送出去。当第49行发送出这四个字节后,六维力传感器就收到了这个命令,按照我们的定义,这个命令是要求传感器不停地发送出采集到的受力值,速度是每秒钟1000次。

程序中之后的部分就是程序的最后一步任务,就是读取传感器发送出来的数据并做解析。由于需要一直解析,所以在程序的61行用了while(1)循环来进行。这个循环里面就是调用接收函数,判断这次调用是否接受了数据,如果有数据就把它们放到待处理数据的末尾。然后下面通过一个嵌套循环判断待处理的数据是不是长度大于零,当大于零时就在这个循环里面处理这些数据。

这个嵌套循环里面其实做了四个分支,这里之所以使用分支而不是直接判断数据合法就使用,是因为串口有个特性,那就是串口发送的数据可能不是完整的一帧。这是由于异步通信,发出的数据在程序运行读取函数时还没有完全发送出去,但其实数据是没有丢失的,下一次运行读取时,程序就可以把上次没读到的半帧数据再接收到。为了能够拿到所有的数据,我们在程序中设置了一个队列缓冲区,读取的数据会放到队列的末尾,处理的循环函数从队列头部进行处理。所以这个处理循环需要有4个分支来判断目前队列头部数据的情况。第一个分支就是队列长度大于28个字节并且是合法的数据,那就直接进行转换处理;第二个分支是长度大于28个字节但是头部数据不合法,那就通过排查,找到合法的头部,把不合法的最开始几个字节去掉;第三个分支就是队列长度远大于28个字节,那就认为程序的处理速度太慢了,我们会清空这个缓冲区,重新接收数据;第四个分支是队列长度小于28个字节,那代表数据太短了,我们会退出循环等数据足够长了再处理。

Step 3:接收数据及数据解析


最后我们再看一下数据的解析,由于C++没有直接提供字符数组到Float类型数据的转换函数,所以我们使用了联合体。这是因为联合体有一个很好的特性,就是同址操作。比如程序第9行我们声明了一个叫z的联合体。它其实占用4个字节,用z.m就可以访问字节数组中的元素,用z.n就能按照Float类型访问这4个字节。所以在程序的第75到80行,我只需要给z.m的每个元素附值成六维力传感器发出的数据,那么z.n就是Float类型的结果了,非常高效。

这些就是一个C++语言的接收和处理六维力传感器的程序,用户在使用时只需要把打印函数换成变量的附值,就可以在自己的程序中使用这些受力信息了。


-END-


往期推荐


【KW 09】六维力传感器通信协议(CAN协议)


【KW 08】六维力传感器通信协议(ModBUS协议)


【KW 07】六维力传感器通信协议(自定义串口协议)

【声明】内容源于网络
0
0
坤维科技
多维力传感器的展示和技术咨询平台,向客户提供包括结构定制和数据采集的整套多维力测量解决方案。欢迎访问公司网站:www.kunweitech.com
内容 86
粉丝 0
坤维科技 多维力传感器的展示和技术咨询平台,向客户提供包括结构定制和数据采集的整套多维力测量解决方案。欢迎访问公司网站:www.kunweitech.com
总阅读54
粉丝0
内容86