我是靠谱客的博主 羞涩小松鼠,最近开发中收集的这篇文章主要介绍Matlab控一切1-网络通信控硬件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Matlab控一切1-网络通信控硬件

    • 一、理解需求
    • 二、找到发送的控制数据
    • 三、Matlab实现数据的转换
    • 四、Matlab求解校验字
    • 五、Matlab网络数据发送
    • 六、小结

一、理解需求

这篇文章尝试解决了这样一个小问题:

有一个射频设备需要网口控制,程序人员已经完成了C语言控制程序编写,功能上没有问题。但由于自动测试其它的程序都是用Matlab编写的,这个程序不好扩展自动测试功能,就想通过Matlab用最简单的方法来完成这个C语言相同的控制功能。

一句话说:用Matlab重写C语言上位机程序,通过网口控制一个射频设备。

当然,正常的方式是找专业测试人员完成所有功能,但沟通起来太麻烦,找不对人还可能折腾半天搞不定,因此还不如考虑自己写。

看完这篇文章,你会发现,常规射频设备的控制没有想象的那么复杂,只要你学会Matlab和这篇文章的套路。基本上绝大多数简单控制都很快能搞定。

二、找到发送的控制数据

因为C语言程序已经写好了,因此第一步先搞清楚上位机发给射频设备的控制码是什么,C语言程序编写用的是这个名为QT的软件。
在这里插入图片描述
找到通过网口给设备发送指令得语句并加断点(当然,这步需要大概能读明白这个程序,不懂得话找写这个程序得人问)。我这里队友函数名起的很规范找到了这个SendNetCommand函数,和存储发送数据得变量pBuf。
在这里插入图片描述
在调试模式下,运行发送控制码,程序跑起来停在设置断点得地方。右键单击并通过下拉菜单,看变量pBuf在内存中得数值。
在这里插入图片描述
在这里插入图片描述
于是看到得内存数据是下图这个样子得。
在这里插入图片描述
以十六进制AA开始一直到十六进制56结束(这组数基于特定得通信协议)。那么接下来我们看一下,这一堆数中到底需要变哪个?

尝试用C语言程序分别控制发送了三个频率8000MHz(图1),9000MHz(图2)和10000MHz(图3),通过断点看到得控制码分别是如下图所示
在这里插入图片描述
图1 8000MHz
在这里插入图片描述
图2 9000MHz
在这里插入图片描述
图3 10000MHz

三次控制并对照通信协议发现,红线圈出得5个数是表示频率,而黄线圈出得1个数是校验字,其余数别看乱七八糟一片,但在这个控制功能下都不变化。

那么接下来得步骤就是根据控制需要,用matlab分别求出红圈和黄圈内得数字,然后按照这个格式构成一个数组发给设备即可。

三、Matlab实现数据的转换

图1-图3中红圈得数是十进制频率所对应得十六进制表示,具体求解可用下面这个小程序。

clear all; close all; clc;
Freq = 8e9;                            % 所需控制得频率
F_D1 = mod(Freq,16^2);                 % 求第一个数
F_D2 = mod(fix(Freq/16^2),16^2);       % 求第二个数
F_D3 = mod(fix(Freq/16^4),16^2);       % 求第三个数
F_D4 = mod(fix(Freq/16^6),16^2);       % 求第四个数
F_D5 = fix(Freq/16^8);                 % 求第五个数
D = [F_D1 F_D2 F_D3 F_D4 F_D5];        % 组成数组
dec2hex(D)                             % 十进制转化成十六进制核对

跑一下这个程序,00 50 D6 DC 01正好对应得就是图1中红圈得数据。
在这里插入图片描述
然后运行下面得程序,讲上面得5个数填入到要发送得数据中。这里Matlab发送得数据用的都是十进制数。因为除黄圈和红圈外,其余得数都一样,因此按同样得格式构建一个包含49个元素得数组SendData就可以。

SendData = [170 170 170 170 49 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ...
    0 0 0 1 0 0 0 32 0 1 0 1 0 0 0 0 202 154 59 0 0 0 0 132];
SendData(41) = F_D1;
SendData(42) = F_D2;
SendData(43) = F_D3;
SendData(44) = F_D4;
SendData(45) = F_D5;

在这步把数填进去得原因是:下一步求解最后一位校验字,是需要用到除最后一位外,前面得所有数据。

四、Matlab求解校验字

按照所采用得通信协议,最后一位校验是通过对前面所有数依次求异或,最后再取反得到,同样编写程序如下,利用SendData中的前48个数求第49个数。

Temp = SendData(1);
for i = 1:(length(SendData)-2)
    Temp = bitxor(Temp,SendData(i+1));   % 依次求异或
end
SendData(end) = bitxor(Temp, 255);       % 取反
dec2hex(SendData(end))

还是用前面8000MHz来求,得到结果如下为B4,与图1最后一位相同。
在这里插入图片描述

五、Matlab网络数据发送

前面得步骤构建好了SendData这个控制数组,最后这里只需要通过Matlab得TCPIP指令发给设备即可。

Client = tcpip('192.168.2.35',5000,'Timeout',1);
fopen(Client);
fwrite(Client,SendData);
fclose(Client);

这里需要注意运行matlab程序得计算机需要同所控设备在同一个IP段内。

六、小结

原始C程序上千行,专业软件人员才能折腾明白,这里的Matlab程序二十多行,能够满足最基本得需要,够用就好。

这个套路可以扩展到用Matlab控很多东西,比如用串口与单片机通信,比如控制仪器,比如用脚本控制软件,且关注后面得文章。

最后

以上就是羞涩小松鼠为你收集整理的Matlab控一切1-网络通信控硬件的全部内容,希望文章能够帮你解决Matlab控一切1-网络通信控硬件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部