历史上的今天
今天是:2024年09月09日(星期一)
2018年09月09日 | matlab与stm32之间利用串口通信记录
2018-09-09 来源:eefocus
1、涉及到的函数
serial,fopen,fclose,
instrfindall,instrhwinfo,
fprintf,fscanf,fwrite,fread,isempty
1.1 串口函数
scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
fopen(scom);
.
fclose(scom);
或者对串口属性单独设置,如下:
scom = serial(com);
scom.BaudRate = 115200;
scom.InputBufferSize = 512;
scom.BytesAvailableFcnMode = 'terminator'; % 'byte'
scom.terminator = CR/LF ;
scom.Timeout = 50; %read or write wait time
fopen(scom);
.
fclose(scom);
通常会在关闭串口后删除串口,在matlab工作空间中清除串口数据:
delete(scom);
clear scom;
问题1.:matlab刚打开后,第一次可以成功打开串口,第二次再打开就会报错如下:
>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(scom)
Error using serial/fopen (line 72)
Open failed: Port: COM6 is not
available. Available ports: COM1.
Use INSTRFIND to determine if other
instrument objects are connected to the
requested device.
处理方法:个人理解是关闭串口后,串口并没有被完全清理,就像有些软件卸载后第二次再安装就会失败,所以需要在重新打开串口之前删除之前对串口的所有设置,如下:
>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(scom);
Error using serial/fopen (line 72)
Open failed: Port: COM6 is not
available. Available ports: COM1.
Use INSTRFIND to determine if other
instrument objects are connected to the
requested device.
>> delete(instrfindall('Type','serial'));
>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(scom);
>> fclose(scom)
>> help instrfindall
instrfindall Find all communication interface objects with specified
property values.
instrfindall函数可以找出所有与matlab通信的接口,也可以找出符合特定参数的接口。
1.2 serial 参数理解
通过>> s=get(scom) 可以过得串口的所有参数以及当前的值,其中主要设置的有:
BaudRate,波特率
ByteOrder,数据大端或者小端模式,默认小段
DataBits,数据位,通常默认8位
Parity,校验位,默认none
StopBits,停止位,默认1
Timeout,matlab串口发送或者读取数据等待时长
ReadAsyncMode,异步读取数据的方式,连续或者手动,默认连续continue
----------
BytesAvailableFcnMode
BytesAvailableFcnCount
BytesAvailableFcn
Terminator
BytesAvailable
matlab搜索可用串口端口函数instrhwinfo :
>> info = instrhwinfo('serial')
info =
HardwareInfo with properties:
AvailableSerialPorts: {2x1 cell}
JarFileVersion: 'Version 3.7'
ObjectConstructorName: {2x1 cell}
SerialPorts: {2x1 cell}
Access to your hardware may be provided by a support package. Go to the Support Package Installer to learn more.
>> info.SerialPorts
ans =
'COM1'
'COM6'
>> info.AvailableSerialPorts
ans =
'COM1'
'COM6'
>> str = char(info.SerialPorts(2))
str =
COM6
>> scom=serial(str);
我在电脑设备管理器查看,用的是串口’COM6’, ‘COM1’还不知道时接的是什么,所以这里想用matlab自动选择串口的功能还没有实现。
1.3 数据读写函数
matlab:
fprintf(scom,'%d\n', data,'async' );
data = fscanf(scom,'%d');
c:
scanf("%d",&data);
printf("%d\r\n",data);
note1:c中scanf、printf函数默认从终端打印读取数据,这里需要重定向fputc、fgetc函数。
note2:c中scanf函数在读取到有效数据前会一直运行不退出。
问题2:在stm32的串口中断函数中调用scanf函数,读取matlab发送的数据,matlab中用fprintf(scom,’%d\r\n’, data,’async’ )发送数据,当stm32进入中断读取数据后,总是会再次进入中断并进入scanf函数出不来。
处理方法:matlab中发送数据的格式 '%d\r\n',即回车加换行,个人理解是串口发送完一字节后也把'\r'即 回车符也发送出去,所以stm32的串口接收缓存中scanf函数读取数据后,由回车符又引起接收中断。
将matlab发送函数中数据格式改为'%d\n' 后,stm32可以正常读取数据。
matlab:
fwrite(scom,data,'uint8','async');
cmd_ack = fread(scom,1,'uint8');
c:
rec = USART_ReceiveData( DEBUG_USART );
Usart_SendByte(DEBUG_USART,data);
note1:fwrite和fread是以二进制的格式发送数据,而上面的fprintf和fscanf是以ASCII码的格式发送。
例如:data为十进制数123,其十六进制为0x7b,底层二进制数据流就是0111 1011,以ASCII码发送是0x31,0x32,0x33,底层数据流是0011 0001,0011 0010,0011 0011。
matlab如果用fwrite和fread函数,串口参数也要改为byte。
史海拾趣
|
Protel99SE精彩教程 此教程采用的样板软件是PROTEL99SE汉化版,对于学习PROTEL99SE很有用~99SE是PROTEL家族中目前最稳定的版本,功能强大。采用了*.DDB数据库格式保存文件,所有同一工程相关的SCH、PCB等文件都可以在同一*.DDB数据库中并存,非常 ...… 查看全部问答> |
|
和初学者说说我学单片机的经过(ZT) 第一次知道"单片机"这三个字,那是1997年.那时我还在读中专,疯狂的在自学电子,这三个字是从 < <电子报> > 上看到的,但当时对单片机没一点认识,电子方面也是一片空白,所以单片机到底是何物,就 ...… 查看全部问答> |
|
要做一个基于AD9851的信号发生电路,初定指标是频率1Hz~30M,已经是高频了,电压为5V。 最关键的是芯片产生信号后,要进行滤波,电压放大,以及功率放大 不知道选择哪款的运放比较合适,是否需要进行级联? 恳请论坛里有模电或者高频经验的高手 ...… 查看全部问答> |
|
Super servers address all of these issues. Rather than have each service accept connections on its own thread, services.exe spins one thread on system startup and listens on a number of sockets, up to 64, for services that request ...… 查看全部问答> |
|
做的一个简单的cla电路,综合后得到电路网表。然后使用write -hierarchy -output cla.db 和write -format Verilog -hierarchy -output cla.v 保存了综合后的网表。但是用pt读后:read_db cla.db 这个说No-Design were read和read_verilog cla.v 这 ...… 查看全部问答> |
|
MSP430如何直接用IAR烧写D43文件,用MSP430 USB型仿真器直接通过IAR建工程烧写IAR编译生成的.D43结尾的文件,方便用于生产使用,不用给原代码,防止工程师原代码泄露,方便实用 [ 本帖最后由 kingheimer 于 2013-3-5 12:59 编辑 ]… 查看全部问答> |




