Matlab提供了串口通信的功能,串口通信的流程如下:
创建一个串口对象的API如下:
scom = serial('<串口号>');
串口号为COM8
的形式,这个API有个缺点:不能自动检测目前电脑中存在中的串口。
创建之后设置该串口对象的属性:
常用设置如下:
scom.InputBufferSize =512;
scom.OutputBufferSize =512;
scom.ReadAsyncMode='continuous';
scom.BaudRate =115200;
scom.Parity ='none';
scom.StopBits =1;
scom.DataBits =8;
scom.Terminator ='CR';
scom.FlowControl ='none';
scom.timeout =1;
scom.BytesAvailableFcnMode = 'byte';
scom.BytesAvailableFcnCount = 1024;
scom.BytesAvailableFcn = @callback;
打开串口的API为:
fopen(scom);
打开串口可能会发生异常,所以此函数建议放在try..catch..end
中执行:
try
fopen(scom);
catch
<捕获到异常时需要打印或者显示的信息>
end
向串口写入数据的API有两个:
fwrite(scom,A); % 以二进制形式向串口对象写入数据A
fprintf(scom,str); %以字符(ASCII码)形式向串口写数据str(字符或字符串)
如果BytesAvailableFcnMode设置的为byte,则使用 fwrite 。
从串口读取数据的API也有两个:
A = fread(scom,size); %从串口对象中读取size字节长短的二进制数据,以数组形式存于A
str = fscanf(scom); %从串口对象中读取字符或字符串(ASCII码)形式数据,以字符数组形式存于str
如果BytesAvailableFcnMode设置的为byte,则使用 fread。
在不使用串口或者关闭界面之前,必须要关闭串口,否则下次将无法打开该串口:
close(scom)
上面讲述了使用fread手动读取数据的方式,但是实际应用中,需要使用串口中断自动接收并处理数据。
触发串口Bytes available事件有两种条件:
在上一节设置属性的最后有这样一行代码:
scom.BytesAvailableFcn = @callback;
这行代码就是设置串口中断处理回调函数,如果是纯m文件可以这样设置,但是在GUI界面中还要传入handles调用控件,如下:
scom.BytesAvailableFcn = {@calllback,handles};
这里我设置的函数名为callbcak
,回调函数自己实现即可:
function callback(s,event,handles)