IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Matlab控一切1-网络通信控硬件 -> 正文阅读

[C++知识库]Matlab控一切1-网络通信控硬件

一、理解需求

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

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:39:53  更:2021-11-15 15:40:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:37:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码