Matlab使用GUI编程实现TCPIP与STM32通信

面向对象

程序使用ALIENTEK 战舰 V3STM32F1 开发板连接ATK-ESP8266 WIFI 模块,串口无线 AP(COM-WIFI AP)、串口无线 STA(COM-WIFI STA)和串口无线AP+STA(COM-WIFI AP+STA)这 3 个模式的测试,每个模式又包含 TCP服务器、 TCP 客户端和 UDP 这 3 个子模式。
使用matlab的GUI编程,选用模式为 COM-WIFI AP+STATCP服务器模式。

TCPIP

matlab帮助文档查找TCPIP
根据帮助文档编写代码,最终实现GUI图像:
最终实现界面

建立连接

% --- Executes on button press in OpenServer.
function OpenServer_Callback(hObject, eventdata, handles)
% hObject    handle to OpenServer (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
port = get(handles.Text_Port,'string');%获得端口
Port = str2num(port);
ipdre1 =  get(handles.IP1,'string');
ipdre2 =  get(handles.IP2,'string');
ipdre3 =  get(handles.IP3,'string');
ipdre4 =  get(handles.IP4,'string');
fprintf('IP分部集合完毕\n');
Ip = strcat(ipdre1+"."+ipdre2+"."+ipdre3+"."+ipdre4);%获得ip地址
fprintf(Ip);
% 构造服务器端tcpip对象
echotcpip('on',Port);                   %启动一个TCPIP回响服务器
t = tcpip(Ip,Port);      %创建一个TCPIP
global tcpiptext
tcpiptext = t;
N = 1024;
set(t,'InputBufferSize',8*N);       %设置输入缓存大小
set(t,'OutputBufferSize',1024);  %设置输出缓存大小

% 打开连接对象
fopen(t);            
fprintf('连接成功\n');
%发送指令
%SendText = get(handles.SendText,'String');   %获取发送文本内容
fwrite(t,'sending test successful','int8')                   %向host写数据
% 等待接收数据

while(1)
    nBytes = get(t,'BytesAvailable');       %在输入缓存区的值
    if nBytes > 0
        break;
    end
end
recvRaw = fread(t,nBytes,'char');   %从host读数据
S = char(recvRaw');                              %转置
%A = fread(t);
% 断开连接
fclose(t);                       
fprintf('读取完毕,内容如下:\n');
set(handles.State2View,'string','连接成功!此时可发送命令至下位机,接收内容如下:');  %在text文本中显示读取的数据
set(handles.Data2View,'string',S);  %在text文本中显示读取的数据
disp(S);                                                  %在命令行中显示读取的数据
echotcpip('off');                                                %停止TCPIP回响服务器
fprintf('echo tcpip链接已停止,此时可发送数据到下位机继续\n');
%guidata(hObject,handles);%保存配置

断开连接

% --- Executes on button press in CloseServer.
function CloseServer_Callback(hObject, eventdata, handles)
% hObject    handle to CloseServer (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Disconnect the TCPIP object from the host and stop the echo server.
% 断开连接
global tcpiptext
t = tcpiptext;
% 关闭和删除连接对象
fclose(t);
delete(t);
echotcpip('off');
fprintf('断开连接,请重新建立连接或退出!\n');
set(handles.State2View,'string','断开连接,请重新建立连接或退出!');  %在text文本中显示读取的数据
% --- Executes on button press in quit.

主要问题

1.对matlab编程不熟悉;
2.在tcpip连接时,使用fscanf(),fgets()等函数不能有效读取发送过来的数据,显示报错:无法获得任何tcpip的数据,根据帮助文档以及百度解决问题;
3.初始没有设置输入输出缓存值,读取数据也是ASCII的值,解决方法:

set(t,'InputBufferSize',8*N);       %设置输入缓存大小
set(t,'OutputBufferSize',1024);  %设置输出缓存大小

while(1)
    nBytes = get(t,'BytesAvailable');       %在输入缓存区的值
    if nBytes > 0
        break;
    end
end
recvRaw = fread(t,nBytes,'char');   %从host读数据

4.从fread读取的数据是一列,使用转置正确读取数据:

recvRaw = fread(t,nBytes,'char');   %从host读数据
S = char(recvRaw');                              %转置

5.使用全局变量global,获得tcpip的链接:

t = tcpip(Ip,Port);      %创建一个TCPIP
global tcpiptext
tcpiptext = t;