程序使用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+STA 的TCP服务器模式。
根据帮助文档编写代码,最终实现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;