一、理解需求
这篇文章尝试解决了这样一个小问题:
有一个射频设备需要网口控制,程序人员已经完成了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控很多东西,比如用串口与单片机通信,比如控制仪器,比如用脚本控制软件,且关注后面得文章。
|