让人疑惑的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发来的串口数据。此时需要把发送请求关闭即可

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信