让人疑惑的STM32F4/F7芯片
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
STM32F4/F7芯片,matalb安装的是2021a版本。
核心代码很简单,如下
s=serial('COM3')%将串口3赋给sfopen(s)%打开串口3fprintf(s,'123456 hello
world')%给串口3的发送缓存写数据fscanf(s)%从串口3的接收缓存读数据fclose(s)%关闭串口3
只要以上几行就可以实现串行通信的读写。但是在实操过程中要想安心使用,有很多小细节要注意,否则会跳出各种各样的报错。必备小技巧总结如下
.在写通信程序前,可以用函数instrhwinfo搜索可用串口端口:
>> info = instrhwinfo('serial')
info =
HardwareInfo with properties:
AvailableSerialPorts: {2x1 cell}
JarFileVersion:
'Version 4.4'
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 =
'COM3'
'COM4'
>> info.AvailableSerialPorts
ans =
'COM3'
'COM4'
>> str = char(info.SerialPorts(2))
str =
COM4
>> scom=serial(str);
通过这种方法,可以在只有一个串口设备的时候自动指定串口。如果串口设备多,就需要其他解决方案了。
tip1:可以用s.status查看串口的开关状态。
tip2:电脑默认波特率9600,一般是需要对串口属性进行设置的,可以一次性设置,也可以单独设置
总括性设置如下
s = serial('com3','BaudRate',115200,'BytesAvailableFcnMode','byte');
也可以分步设置
s = serial(com);
s.BaudRate = 115200;
s.InputBufferSize = 512;
s.BytesAvailableFcnMode = 'terminator'; % 'byte'
s.Timeout = 50; %read or write wait time
%s.terminator = CR/LF ; %此处要注意
这里要注意,在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.
Dos和windows:采用回车+换行CR/LF表示下一行.
UNIX/Linux:采用换行符LF表示下一行.
MAC OS:采用回车符CR表示下一行.
CR用符号'\r'表示,十进制ASCII代码是13,十六进制代码为0x0D;
LF用符号'\n'表示,十进制ASCII代码是10,十六制为0x0A.
所以Windows平台上换行在文本文件中是使用 0d 0a两个字节表示,而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.
所以在发送的时候输出格式要使用\n,如果使用\r\n的格式的话,\r也会被当作信息被接收。CR代表回车,LF代表换行。
关于其设置,也是要用set指令,因为内部是个1*2的cell,保存了读和写的设置,所以单纯的用s.terminator = CR/LF会报错。
set(s,'Terminator',{'CR/LF','CR/LF'})
tip3:通过>> s=get(scom)可以过得串口的所有参数以及当前的值,其中主要可以设置:
BaudRate,波特率
ByteOrder,数据大端或者小端模式,默认小段
DataBits,数据位,通常默认8位
Parity,校验位,默认none
StopBits,停止位,默认1
Timeout, matlab串口发送或者读取数据等待时长
ReadAsyncMode,异步读取数据的方式,连续或者手动,默认连续continue
----------
BytesAvailableFcnMode
BytesAvailableFcnCount
BytesAvailableFcn
Terminator
BytesAvailable
表示数据有效的触发方式,相当于c中的中断触发事件:默认值terminator,表示串口接收到特定的终止符时,触发bytes-available
event,参数自动加一,并进入由指向的回调函数,相当于c中的中断函数;可选值byte,表示串口收到一个字节时,触发bytes-available
event,自动加一,当收到一个字节时进入回调函数。
终止符通常是回车或者换行符,也可以自己设定,根据通信协议自定义,[Windows、Linux和MAC的CR, LF, CR/LF换行符]
Tip4: fwrite和fprint的区别
fwrite(scom,data,'uint8','async');
data_ack = fread(scom,1,'uint8');
fwrite和fread是以二进制的格式发送数据,而上面的fprintf和fscanf是以ASCII码的格式发送。
例如:data为十进制数123,其十六进制为0x7b,底层二进制数据流就是0111
1011,以ASCII码发送是0x31,0x32,0x33,底层数据流是0011 0001,0011 0010,0011 0011。
matlab如果用fwrite和fread函数,串口参数也要改为byte。
Tip5:通常需要在关闭串口后删除串口
delete(scom);
clear scom;
Tip6:matlab刚打开后,第一次可以成功打开串口,第二次再打开就会报错如下:
>> s = serial('com3','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(s)
Error using serial/fopen (line 72)
Open failed: Port: COM3 is not
available. Available ports: COM1.
Use INSTRFIND to determine if other
instrument objects are connected to the
requested device.
虽然我们用fclose关闭串口,但串口并没有被完全清理,需要删除之前对串口的所有设置,如下:
>> delete(instrfindall('Type','serial'));
Tip7:STM32和MATLAB的USB串口通信时,STM32会出现复位情况,导致MATLAB不能正常读取从STM32发来的串口数据。此时需要把发送请求关闭即可