matlab读取图像并用串口发送_第1页
matlab读取图像并用串口发送_第2页
matlab读取图像并用串口发送_第3页
matlab读取图像并用串口发送_第4页
matlab读取图像并用串口发送_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、function varargout = serial_communication2(varargin)gui_singleton = 1;gui_state = struct(gui_name, mfilename, . gui_singleton, gui_singleton, . gui_openingfcn, serial_communication2_openingfcn, . gui_outputfcn, serial_communication2_outputfcn, . gui_layoutfcn, , . gui_callback, );if nargin & ischar(

2、varargin1) gui_state.gui_callback = str2func(varargin1);endif nargout varargout1:nargout = gui_mainfcn(gui_state, varargin:);else gui_mainfcn(gui_state, varargin:);endfunction serial_communication2_openingfcn(hobject, eventdata, handles, varargin)handles.output = hobject;warning(off);javaframe = get

3、(hobject, javaframe);javaframe.setfigureicon(javax.swing.imageicon(icon.jpg);% 初始化参数hasdata = false; %表征串口是否接收到数据isshow = false; %表征是否正在进行数据显示,即是否正在执行函数datadispisstopdisp = false; %表征是否按下了【停止显示】按钮ishexdisp = false; %表征是否勾选了【十六进制显示】ishexsend = false; %表征是否勾选了【十六进制发送】numrec = 0; %接收字符计数numsend = 0; %发

4、送字符计数strrec = ; %已接收的字符串% 将上述参数作为应用数据,存入窗口对象内setappdata(hobject, hasdata, hasdata);setappdata(hobject, strrec, strrec);setappdata(hobject, numrec, numrec);setappdata(hobject, numsend, numsend);setappdata(hobject, isshow, isshow);setappdata(hobject, isstopdisp, isstopdisp);setappdata(hobject, ishexdi

5、sp, ishexdisp);setappdata(hobject, ishexsend, ishexsend);guidata(hobject, handles);function varargout = serial_communication2_outputfcn(hobject, eventdata, handles) varargout1 = handles.output;function com_callback(hobject, , handles)function com_createfcn(hobject, eventdata, handles)if ispc & isequ

6、al(get(hobject,backgroundcolor), get(0,defaultuicontrolbackgroundcolor) set(hobject,backgroundcolor,white);endfunction rate_callback(hobject, eventdata, handles)function rate_createfcn(hobject, eventdata, handles)if ispc & isequal(get(hobject,backgroundcolor), get(0,defaultuicontrolbackgroundcolor)

7、set(hobject,backgroundcolor,white);endfunction jiaoyan_callback(hobject, eventdata, handles)function jiaoyan_createfcn(hobject, eventdata, handles)if ispc & isequal(get(hobject,backgroundcolor), get(0,defaultuicontrolbackgroundcolor) set(hobject,backgroundcolor,white);endfunction data_bits_callback(

8、hobject, eventdata, handles)function data_bits_createfcn(hobject, eventdata, handles)if ispc & isequal(get(hobject,backgroundcolor), get(0,defaultuicontrolbackgroundcolor) set(hobject,backgroundcolor,white);endfunction stop_bits_callback(hobject, eventdata, handles)function stop_bits_createfcn(hobje

9、ct, eventdata, handles)if ispc & isequal(get(hobject,backgroundcolor), get(0,defaultuicontrolbackgroundcolor) set(hobject,backgroundcolor,white);endfunction start_serial_callback(hobject, eventdata, handles)% 【打开/关闭串口】按钮的回调函数% 打开串口,并初始化相关参数% 若按下【打开串口】按钮,打开串口if get(hobject, value) % 获取串口的端口名 com_n =

10、sprintf(com%d, get(, value); % 获取波特率 rates = 1200 2400 4800 9600 19200 38400 43000 56000 57600 115200 921600 1036800; baud_rate = rates(get(handles.rate, value); % 获取校验位设置 switch get(handles.jiaoyan, value) case 1 jiaoyan = none; case 2 jiaoyan = odd; case 3 jiaoyan = even; end % 获取数据位个数 data_bits =

11、 5 + get(handles.data_bits, value); % 获取停止位个数 stop_bits = get(handles.stop_bits, value); % 创建串口对象 scom = serial(com_n); % 配置串口属性,指定其回调函数 set(scom, baudrate, baud_rate, parity, jiaoyan, databits,. data_bits, stopbits, stop_bits,inputbuffersize,1638400, outputbuffersize,1638400,bytesavailablefcncount,

12、 10,. bytesavailablefcnmode, byte, bytesavailablefcn, bytes, handles,. timerperiod, 0.05, timerfcn, datadisp, handles); % 将串口对象的句柄作为用户数据,存入窗口对象 set(handles.figure1, userdata, scom); % 尝试打开串口 try fopen(scom); %打开串口 catch % 若串口打开失败,提示“串口不可获得!” msgbox(串口不可获得!); set(hobject, value, 0); %弹起本按钮 return; en

13、d % 打开串口后,允许串口发送数据,清空接收显示区,点亮串口状态指示灯, % 并更改本按钮文本为“关闭串口” set(handles.period_send, enable, on); %启用【自动发送】按钮 set(handles.manual_send, enable, on); %启用【手动发送】按钮 set(handles.xianshi, string, ); %清空接收显示区 set(handles.activex1, value, 1); %点亮串口状态指示灯 set(hobject, string, 关闭串口); %设置本按钮文本为“关闭串口”else %若关闭串口 % 停止

14、并删除定时器 t = timerfind; if isempty(t) stop(t); delete(t); end % 停止并删除串口对象 scoms = instrfind; stopasync(scoms); fclose(scoms); delete(scoms); % 禁用【自动发送】和【手动发送】按钮,熄灭串口状态指示灯 set(handles.period_send, enable, off, value, 0); %禁用【自动发送】按钮 set(handles.manual_send, enable, off); %禁用【手动发送】按钮 set(handles.activex

15、1, value, 0); %熄灭串口状态指示灯endfunction datadisp(obj, event, handles)global value%串口的timerfcn回调函数% 串口数据显示% 获取参数hasdata = getappdata(handles.figure1, hasdata); %串口是否收到数据strrec = getappdata(handles.figure1, strrec); %串口数据的字符串形式,定时显示该数据numrec = getappdata(handles.figure1, numrec); %串口接收到的数据个数% 若串口没有接收到数据,先

16、尝试接收串口数据if hasdata bytes(obj, event, handles);end% 若串口有数据,显示串口数据if hasdata % 给数据显示模块加互斥锁 % 在执行显示数据模块时,不接收串口数据,即不执行bytesavailablefcn回调函数 setappdata(handles.figure1, isshow, true); set(handles.xianshi, string, strrec); % 更新接收计数 set(handles.rec,string, numrec); % 更新hasdata标志,表明串口数据已经显示 setappdata(handl

17、es.figure1, hasdata, false); % 给数据显示模块解锁 setappdata(handles.figure1, isshow, false);end function bytes(obj, , handles)% 串口的bytesavailablefcn回调函数% 串口接收数据% 获取参数strrec = getappdata(handles.figure1, strrec); %获取串口要显示的数据numrec = getappdata(handles.figure1, numrec); %获取串口已接收数据的个数isstopdisp = getappdata(ha

18、ndles.figure1, isstopdisp); %是否按下了【停止显示】按钮ishexdisp = getappdata(handles.figure1, ishexdisp); %是否十六进制显示isshow = getappdata(handles.figure1, isshow); %是否正在执行显示数据操作% 若正在执行数据显示操作,暂不接收串口数据if isshow return;end% 获取串口可获取的数据个数n = get(obj, bytesavailable);% 若串口有数据,接收所有数据if n % 更新hasdata参数,表明串口有数据需要显示 setappd

19、ata(handles.figure1, hasdata, true); % 读取串口数据 a = fread(obj, n, uchar); % 若没有停止显示,将接收到的数据解算出来,准备显示 if isstopdisp % 根据进制显示的状态,解析数据为要显示的字符串 if ishexdisp c = char(a); else strhex = dec2hex(a); strhex2 = strhex; blanks(size(a, 1); c = strhex2(:); end % 更新已接收的数据个数 numrec = numrec + size(a,1); % 更新要显示的字符串

20、 strrec = strrec c; end % 更新参数 setappdata(handles.figure1, numrec, numrec); %更新已接收的数据个数 setappdata(handles.figure1, strrec, strrec); %更新要显示的字符串endfunction qingkong_callback(hobject, eventdata, handles)% 清空要显示的字符串setappdata(handles.figure1, strrec, );% 清空显示set(handles.xianshi, string, );function stop

21、_disp_callback(hobject, eventdata, handles)% 根据【停止显示】按钮的状态,更新isstopdisp参数if get(hobject, value) isstopdisp = true;else isstopdisp = false;endsetappdata(handles.figure1, isstopdisp, isstopdisp);function hex_disp_callback(hobject, eventdata, handles)% 根据【十六进制显示】复选框的状态,更新ishexdisp参数if get(hobject, valu

22、e) ishexdisp = true;else ishexdisp = false;endsetappdata(handles.figure1, ishexdisp, ishexdisp);function manual_send_callback(hobject, eventdata, handles)scom = get(handles.figure1, userdata);numsend = getappdata(handles.figure1, numsend);val = get(handles.sends, userdata);numsend = numsend + length

23、(val);set(handles.trans, string, num2str(numsend);setappdata(handles.figure1, numsend, numsend);% 若要发送的数据不为空,发送数据if isempty(val) % 设置倒计数的初值 n = 2000000; while n % 获取串口的传输状态,若串口没有正在写数据,写入数据 str = get(scom, transferstatus); if (strcmp(str, write) | strcmp(str, read&write) fwrite(scom, val, uint8, asyn

24、c); %数据写入串口 break; end n = n - 1; %倒计数 endendfunction clear_send_callback(hobject, eventdata, handles)% 清空发送区set(handles.sends, string, )% 更新要发送的数据set(handles.sends, userdata, );function period_send_callback(hobject, eventdata, handles)% 【自动发送】按钮的callback回调函数% 若按下【自动发送】按钮,启动定时器;否则,停止并删除定时器if get(hob

25、ject, value) t1 = 0.001 * str2double(get(handles.period1, string);%获取定时器周期 t = timer(executionmode,fixedrate, period, t1, timerfcn,. manual_send_callback, handles); %创建定时器 set(handles.period1, enable, off); %禁用设置定时器周期的edit text对象 set(handles.sends, enable, inactive); %禁用数据发送编辑区 start(t); %启动定时器else

26、set(handles.period1, enable, on); %启用设置定时器周期的edit text对象 set(handles.sends, enable, on); %启用数据发送编辑区 t = timerfind; %查找定时器 stop(t); %停止定时器 delete(t); %删除定时器end%function period1_callback(hobject, eventdata, handles)function period1_createfcn(hobject, eventdata, handles)if ispc & isequal(get(hobject,ba

27、ckgroundcolor), get(0,defaultuicontrolbackgroundcolor) set(hobject,backgroundcolor,white);endfunction clear_count_callback(hobject, eventdata, handles)% 计数清零,并更新参数numrec和numsendset(handles.rec, handles.trans, string, 0)setappdata(handles.figure1, numrec, 0);setappdata(handles.figure1, numsend, 0);fu

28、nction copy_data_callback(hobject, eventdata, handles)% 设置是否允许复制接收数据显示区内的数据if get(hobject,value) set(handles.xianshi, enable, on);else set(handles.xianshi, enable, inactive);endfunction figure1_closerequestfcn(hobject, eventdata, handles)% 关闭窗口时,检查定时器和串口是否已关闭% 若没有关闭,则先关闭% 查找定时器t = timerfind;% 若存在定时器

29、对象,停止并关闭if isempty(t) stop(t); %若定时器没有停止,则停止定时器 delete(t);end% 查找串口对象scoms = instrfind;% 尝试停止、关闭删除串口对象try stopasync(scoms); fclose(scoms); delete(scoms);end% 关闭窗口delete(hobject);function hex_send_callback(hobject,eventdata, handles)% 根据【十六进制发送】复选框的状态,更新ishexsend参数if get(hobject,value) ishexsend = tr

30、ue;else ishexsend = false;endsetappdata(handles.figure1, ishexsend, ishexsend);% 更新要发送的数据sends_callback(handles.sends, eventdata, handles);function sends_callback(hobject,eventdata, handles)% 数据发送编辑区的callback回调函数% 更新要发送的数据% 获取数据发送编辑区的字符串str = get(hobject, string);% 获取参数ishexsend的值ishexsend = getappd

31、ata(handles.figure1, ishexsend);if ishexsend %若为ascii值形式发送,直接将字符串转化为对应的数值 val = double(str);else %若为十六进制发送,获取要发送的数据 n = find(str = ); %查找空格 n =0 n length(str)+1; %空格的索引值 % 每两个相邻空格之间的字符串为数值的十六进制形式,将其转化为数值 for i = 1 : length(n)-1 temp = str(n(i)+1 : n(i+1)-1); %获得每段数据的长度,为数据转换为十进制做准备 if rem(length(temp), 2) bi = reshape(temp, 2, ); %将每段十六进制字符串转化为单元数组 else brea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论