Matlab串口通信

matlab 2019对串口部分操作函数进行了升级,提升了性能和可靠性

主要替代关系如下

The serial function, its object functions, and its properties are not recommended. Use serialport instead.

serial Interfaceserialport InterfaceExample
seriallistserialportlistDiscover Serial Port Devices
serialserialportConnect to Serial Port Device
fwrite and freadwrite and readRead and Write
fprintfwritelineSend a Command
fscanffgetl, and fgetsreadlineRead a Terminated String
flushinput and flushoutputflushFlush Data from Memory
TerminatorconfigureTerminatorSet Terminator
BytesAvailableFcnCountBytesAvailableFcnMode,BytesAvailableFcn, and BytesAvailableconfigureCallbackSet Up a Callback Function
PinStatusgetpinstatusRead Serial Pin Status
DataTerminalReady and RequestToSendsetDTR and setRTSSet Serial DTR and RTS Pin States

 

 

搜索串口

2019之前

显示串行端口的列表
seriallist 函数显示系统上所有串行端口的列表。

显示可用的串行端口。

seriallist
ans = 

  1×2 string array

  "COM1"    "COM3"
现在,您可以创建 serial 对象,并通过串行端口通信。

2019之后推荐的方法

serialportlist

serialportlist("all")

serialportlist("available")

举例

识别电脑上的串口

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

串口api变化  https://ww2.mathworks.cn/help/matlab/matlab_external/transition-your-code-to-serialport-interface.html

 

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整型


 

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Matlab可以通过Instrument Control Toolbox来进行串口通信。该工具箱提供了对TCP/IP、UDP、I2C、SPI和蓝牙串口协议的内置支持,可以实现与其他计算机和电路板的远程通信。在Matlab中,可以通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,然后对串口对象进行操作。这样的封装使得串口操作非常方便,并且支持异步读写操作,可以在读写串口时同时进行其他处理工作,提高计算机的执行效率。通过设置异步读写,计算机在执行读写串口函数时能立即返回,不必等待串口传输完毕,当指定的数据传输结束时触发事件,执行事件回调函数,可以在事件回调函数中进行数据处理,避免时间浪费。在使用Matlab进行串口通信时,可以使用虚拟串口工具生成一对虚拟串口,然后在Matlab中打开串口工具,设置串口信息,选择对应的虚拟串口进行通信。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [【MATLAB】使用matlab进行串口通信(详细方法+代码讲解)](https://blog.csdn.net/hahahahhahha/article/details/106207018)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Matlab使用串口进行数据通信](https://blog.csdn.net/weixin_46943050/article/details/125043363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值