matlab 2019对串口部分操作函数进行了升级,提升了性能和可靠性
主要替代关系如下
The serial
function, its object functions, and its properties are not recommended. Use serialport
instead.
serial Interface | serialport Interface | Example |
---|---|---|
seriallist | serialportlist | Discover Serial Port Devices |
serial | serialport | Connect to Serial Port Device |
fwrite and fread | write and read | Read and Write |
fprintf | writeline | Send a Command |
fscanf , fgetl , and fgets | readline | Read a Terminated String |
flushinput and flushoutput | flush | Flush Data from Memory |
Terminator | configureTerminator | Set Terminator |
BytesAvailableFcnCount , BytesAvailableFcnMode ,BytesAvailableFcn , and BytesAvailable | configureCallback | Set Up a Callback Function |
PinStatus | getpinstatus | Read Serial Pin Status |
DataTerminalReady and RequestToSend | setDTR and setRTS | Set Serial DTR and RTS Pin States |
搜索串口
2019之前
显示串行端口的列表
seriallist 函数显示系统上所有串行端口的列表。
显示可用的串行端口。
seriallist
ans =
1×2 string array
"COM1" "COM3"
现在,您可以创建 serial 对象,并通过串行端口通信。
2019之后推荐的方法
举例
识别电脑上的串口
ports = serialportlist
ports =
1×4 string array
"COM1" "COM3" "COM11" "COM12"
识别目前可用的串口
freeports = serailportlist("available")
freeports =
1×2 string array
"COM1" "COM12"
使用串口
2019之前
s = serial("COM1");
s.BaudRate = 115200;
fopen(s)
2019之后推荐的方法
s = serialport("COM1",115200);
读写串口
2019之前
% s is a serial object
fwrite(s,1:5,"uint32")
data = fread(s,5,"uint32")
% s is a serial object
command = "start";
fwrite(s,command,"char")
% s is a serial object
length = 5;
resp = fread(s,length,"char")
2019之后推荐的方法
% s is a serialport object
write(s,1:5,"uint32")
data = read(s,5,"uint32")
% s is a serialport object
command = "start";
write(s,command,"char")
% s is a serialport object
command = "start";
write(s,command,"string")
% s is a serialport object
length = 5;
resp = read(s,length,"string")
发送SCPI命令
之前
% s is a serial object
s.Terminator = "CR/LF"
channel = 1;
level = 3.44;
fprintf(s,"TRIGGER%d:LEVEL2 %1.2f",[channel,level]);
现在推荐的方法
% s is a serialport object
configureTerminator(s,"CR/LF")
channel = 1;
level = 3.44;
cmd = sprintf("TRIGGER%d:LEVEL2 %1.2f",[channel,level]);
writeline(s,cmd)
接收SCPI
% s is a serial object
fprintf(s,"MEASUREMENT:IMMED:TYPE PK2PK")
a = fscanf(s,"%e",6)
% s is a serial object
fprintf(s,"*IDN?")
a = fgetl(s)
% s is a serial object
fprintf(s,"*IDN?")
a = fgets(s)
现在推荐的方法
% s is a serialport object
writeline(s,"MEASUREMENT:IMMED:TYPE PK2PK")
a = readline(s)
sscanf(a,"%e")
% s is a serialport object
writeline(s,"*IDN?")
a = readline(s)
设置结束符
之前
% s is a serial object
s.Terminator = "CR/LF";
% s is a serial object
s.Terminator = {"CR/LF" [10]};
现在推荐的方法
% s is a serialport object
configureTerminator(s,"CR/LF")
% s is a serialport object
configureTerminator(s,"CR/LF",10)
回调函数
之前
s = serial("COM5","BaudRate",115200)
s.BytesAvailableFcnCount = 5
s.BytesAvailableFcnMode = "byte"
s.BytesAvailableFcn = @instrcallback
fopen(s)
function instrcallback(src,evt)
data = fread(src,src.BytesAvailable)
disp(evt)
disp(evt.Data)
end
现在推荐的方法
s = serialport("COM5",115200)
configureCallback(s,"byte",5,@instrcallback);
function instrcallback(src,evt)
data = read(src,src.NumBytesAvailable,"uint8")
disp(evt)
end
API
2019之前 https://ww2.mathworks.cn/help/matlab/serial-port-devices.html?s_tid=CRUX_lftnav
2019 https://ww2.mathworks.cn/help/matlab/serial-port-devices.html?lang=en
Matlab工具箱介绍
https://ww2.mathworks.cn/help/index.html?s_tid=CRUX_lftnav
2019之前通过串口发送十六进制数据
try
controller1=serial('com9');
controller1.BaudRate=9600;
set(controller1,'Baudrate',9600,'DataBits',8,'Parity','none','StopBits',1);
fopen(controller1);
%method 1
Str = 'FF0101003F'; %string defines the hexadecimal content to be sent
D = sscanf(Str, '%2x'); %converts a string to hex data
fwrite(controller1, D, 'uint8') %Send this data to the defined serial port s
%method 2
sendbuff=zeros(1,6);
sendbuff(1)= hex2dec('FF');
sendbuff(2)= hex2dec('01');
sendbuff(3)= hex2dec('01');
sendbuff(4)= hex2dec('00');
fwrite(controller1, sendbuff, 'uint8');
fclose(controller1);
catch ME
fprintf('%s\n',ME.message);
end
num = ['FF';'01';'01';'00';'30';'CF'];
num = hex2dec(num );
fwrite(controller1, num, 'uint8');
test = [164 0 0 14 8 49 2 51 52 164];
[x,y] = size(test);
%test_hex = dec2hex(test);
fwrite(scom1, test, 'uint8');
val = [170 180 val 85];
fwrite(scom, val, 'uint8', 'async'); %数据写入串口 PC机上位机发送 这是当年做智能车时的Matlab_GUI 串口上位机 自己help fwrite看下就好 我也忘了这什么意思了 这是当时一段的代码 单片机接收的就是16进制数 数值为val 中的4个数
PC机接收单片机传来数据:
n_bytes = get(obj,'BytesAvailable'); %% 数据总数量
if n_bytes %% 有效读取 防止Matlab延迟进入或误进入
Data = fread(obj, n_bytes, 'uchar')'; %% 读走数据并存入Data中 直接为十进制数值形式
num = ['FF';'01';'01';'00';'30';'CF'];
num = hex2dec(num );
fprintf(sr3,num );
原理就是把16进制转化为10进制,再以十进制发送,串口以十六进制接收的时候就是接受的原始数据,
最近在做串口通信的实验,串口连接都已经完成,我的仪器需要发送一个16位进制数才能返回一个数据,我需要发送的16进制数为‘4053 0000 0d0a’,我用fwrite来发送,用fread来读取,未能成功,请教罗老师该怎么修改?!书中的串口实例我也用过,不成功,但是我用VC版的串口小精灵能调通,希望罗老师能帮我指引一下,非常感谢!
fwrite(scom,val,'uint8','async'); %其中val就是我要发送的命令
已经自己解决了,原来fwrite可以输入数字矩阵,只要把‘4053 0000 0d0a’以一个字节为单位转换为十进制的数字矩阵就可以了,转换后为[64 83 00 00 13 10]就可以了,之前一直以为是把16进制统一转换成10进制。
fwrite(scom,[64 83 00 00 13 10],'unit8','async')
out=fread(s,10,'uint8'); %一次读出10个字符
fprintf('%3c',out); %一个字符占三位输出,%c字符,%d整型