项目背景
简单介绍一下本人目前在做的项目,是关于电阻抗成像设备硬件系统研发。原理如下图所示:通过电极注入电流,再采集各电极之间的电压,通过计算阻抗进而实现成像。
![](https://i-blog.csdnimg.cn/blog_migrate/5f7a35d3c300047f7391158a0d590c38.jpeg)
下位机采用STM32F407+LAN8720A,基于LWIP实现TCP Client通讯,将通过网口持续向上位机传输电压信息(每秒20帧,一帧包含208个电压数据)。本文将介绍如何让MATLAB充当TCP Server实现数据连续接收。本人才疏学浅,如有错误还请指正。
Matlab代码
先上Malab代码。程序的运行效果是Malab作为TCP服务端不断接收TCP数据帧,并使用plot()实时显示采集的电压数据。
clc,clear,close all;
% TCP连接
t_server=tcpip('192.168.6.110',9999,'NetworkRole','server','ByteOrder','littleEndian'); % 建立TCP Server
set(t_server, 'RemoteHost', '192.168.6.5'); % 配置client IP
fopen(t_server); % 打开服务器,直到建立一个TCP连接才返回;
try_Frames_times = 100; %接收的帧数
% 数据读取
for i=1:try_Frames_times % 建立连接后读取数据
pause(0.5); % 每次读取之前等待0.5s,可设置为任意值
try
data_recv=fread(t_server,t_server.BytesAvailable); %从缓冲区读取数字数据
catch
t_server.ValuesReceived % 查看读取出的数据数量,如果没有读到,返回0;
end
plot(data_recv); %绘制接收的数据
end
补充
讲一下几个注意的点:
网络连接设置:本地IP、远端IP、端口号这一些要与Matlab代码中的设置一致;
由于本人在STM32板子上移植的LWIP没有实现网线的热插拔功能,程序运行时可能会卡在fopen(t_server),本人的解决措施是先运行Matlab代码,然后复位单片机,重新初始化网卡建立TCP连接。
单片机使用小端模式,电脑使用的是大端模式,数据传输时要注意大小端的转换。如在本文在函数tcpip()中,将数据模式设置为小端模式('ByteOrder','littleEndian');
关于在STM32移植LWIP实现TCP通讯,网上由很多的教程,这里就不展开介绍,有时间再写一下。