首页 > 编程知识 正文

matlab串口通信助手,软件模拟串口

时间:2023-05-06 13:38:39 阅读:57572 作者:689

Matlab GUI由于项目的需要,需要学习的东西又复杂又浅。 在别忘了之前,写下重要的注意事项。

命令行窗口输入guide -空白GUI--

根据需要,拖动相应的工具以选择,如下图所示

双击每个对象可显示其复选框,以修改其属性、字体大小、粗细、位置等。 其中最重要的是两个。 一个是String,两个是Tag。 字符串用于修改对象中的字符,而Tag是要调用的代码名称。 这个好的代码习惯,你尽量看了就能得到。 例如,序列号使用portbutton等,在弹出菜单中输入字符串,并根据需要输入多行。 一般,习惯上用面板包围某个模块的各功能,设为上图的控制区域、发送区域、接收区域等

的拖动比较简单,接下来需要实现具体功能。 可以在对象上单击鼠标右键-显示回调callback导航到代码区域。

我实现的功能和代码主要包括以下部分

1 .打开/关闭串行端口

1.1右键单击“端口号com1”按钮,打开callback。 因为在打开串行端口之前必须选择对应的端口号。

functionppport _ callback (h object,eventdata,handles ) )。

%hobjecthandletoPPport(seegcbo ) )。

% event data reserved-tobedefinedinafutureversionofmatlab

% handlesstructurewithhandlesanduserdata (see guidata ) )。

% hints : contents=cellstr (get ) hobject,' String ' ) returnsppportcontentsascellarray

%contents{get(hobject,' Value ' ) } returns selected item from PP端口

全局端口

scoms=instrfind; %读取所有存在的端口

if~isempty(Scoms ) )。

停止同步(scoms ); 关闭(scoms; Delete(Scoms; %停止和删除串行对象

结束

vall=get(Handles.PPport,' Value ';

交换机价值

情况1

port='com1 ';

情况2

port='com2';

情况3

port='com3';

情况4

port='com4';

情况5

port='com5 ';

结束

其中,handles.xxx是抓取所单击的项,handles .后面跟要抓取的函数的函数名称。 上面的代码可以是端口号com1~com5之一,也就是说,tag会抓住ppPort中对象的值。

弹出式菜单中的字符串每行对应于case中的1到5,单击这些选项将执行“‘port=XXX”

1.2右键单击“打开串行端口”按钮以打开其callback函数

functionpbopenserial _ callback (h object,eventdata,handles ) )。

% hobjecthandletopbopenserial (seegcbo ) )。

% event data reserved-tobedefinedinafutureversionofmatlab

% handlesstructurewithhandlesanduserdata (see guidata ) )。

全球端口;

显示(端口)

Conm_num_str=port;

全球方案;

som=串行(conm _ num _ str );

Scom.InputBufferSize=2000; 设置buf空间,最多一个命令就足以返回数据存储

Scom.timeout=3;

Scom.BaudRate=115200;

Scom.DataBits=8;

Scom.Parity='none ';

Scom.StopBits=1;

Scom.ByteOrder='bigEndian ';

fopen(SCOM; 打开%串行设备对象

fprintf(openserialsuccess );

set(Handles.pbopenserial

,'enable','off');%打开串口的按钮变成灰色,不再可用

这里需要注意的是如果想在不同的函数下用同一个变量,需要用global定义全局变量,并且在每一个要用到这个这个变量的函数中都用global 定义一下。在打开串口的函数中,串口号port调用于串口选择函数,串口配置Scom将会在关闭串口的函数中用到。

1.3右键“关闭串口”,选择callback。

function pbCloseSerial_Callback(hObject, eventdata, handles)

% hObject handle to pbCloseSerial (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

set(handles.pbOpenSerial,'enable','on');%打开串口的按钮重新可用

global Scom;%全局变量Scom

display(Scom)

fclose(Scom);

delete(Scom);

2.串口收发

在打开串口之后,开始执行数据的收发,并在发送区和接收区显示

2.1串口通过发送区文本框以及“发送数据按”钮实现串口发送

function pbSend_Callback(hObject, eventdata, handles)

% hObject handle to pbSend (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

global d

global Scom

global tmp_hex

d=get(handles.editS,'String');%editS为发送数据的文本编辑框,抓取里面的字符串

if(iscell(d))%这句是debug出了问题之后的修正,有时候输入的字符串会抓取为元胞数组,需要提取其字符串,如果抓取的值直接是字符串那就处理字符串,如果抓取的是元胞数组,就提取其字符串并处理

m=d{1};

else

m=d

end

display(d)

switch m

case {'PRESS','press'}

a=['01';'03';'xx';'xx';'xx';'xx';'xx';'xx'];%本代码采用modbus协议

data=hex2dec(a);%将16进制数字转换为10进制

fwrite(Scom,data);%将数据发送至串口

tmp_hex = fread(Scom,8)%接收单片机数据,并存入tmp_hex数组

tmp_int=tmp_hex(4)*256+tmp_hex(5);

tmp_dec=tmp_hex(6)*256+tmp_hex(7);

tmp_press=(tmp_int*1000+tmp_dec)/1000.0%保留三位有效数字

set(handles.editR,'string',['压力: ',num2str(tmp_press),'mN']);%将数组的值转换为字符串并在接收区显示editR为接收数据的文本编辑框

press=[ press,tmp_press];%将数据存入press数组中,以便在坐标系中绘制曲线

case ...

end

目前演示结果如下:

2.2发送区和接收区数据清空

function pbClearT_Callback(hObject, eventdata, handles)

% hObject handle to pbClearT (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

set(handles.editS,'String','');

% --- Executes on button press in pbClearR.

function pbClearR_Callback(hObject, eventdata, handles)

% hObject handle to pbClearR (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

set(handles.editR,'string','');

3 坐标系显示曲线

由于项目有多种待测量需要分时显示,故采用一个弹出式菜单来控制曲线绘制。

function ppCurveDisplay_Callback(hObject, eventdata, handles)

% hObject handle to ppCurveDisplay (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns ppCurveDisplay contents as cell array

% contents{get(hObject,'Value')} returns selected item from ppCurveDisplay

global ch

global press;%串口收发生成press数组

vall=get(handles.ppCurveDisplay,'Value');

switch vall

case 1

ch='xxx',axes(handles.axes1),plot(R2T,'g'),hold on,plot(R3T,'b'),plot(R4T,'r')...;

case 2

ch='侧向压力',cla,axes(handles.axes1),plot(press,'b'), grid on ,xlabel('SampleNum'),ylabel('Press/mN'),title(ch);%cla用于清空曲线,否则会出现曲线的叠加,坐标系的函数名为axes1,抓取该坐标系并对其进行操作

case 3

...

end

显示结果如下,当然由于未连接设备,采集到的数据均为0,故为一条press=0mN的直线。

Matlab GUI实现简单的很容易,但是在操作过程中会有各种各样的bug,需要慢慢探索研究……

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。