• 让人疑惑的STM32F4F7芯片


    让人疑惑的STM32F4/F7芯片

    9a1e893da06e3b476768cd4655401155.png///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///f661b45629df1245738d94e08d46a7ac.png

    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'));

    d4fdb15aa174f8710e1fd3b5fbad66ee.png
    Tip7:STM32和MATLAB的USB串口通信时,STM32会出现复位情况,导致MATLAB不能正常读取从STM32发来的串口数据。此时需要把发送请求关闭即可

  • 相关阅读:
    [毕业设计]机器学习的运动目标跟踪-opencv
    实施主品牌进化战略(一):确立主品牌进化架构
    今天步行数4000多
    关于深度学习和大模型的基础认知
    ubuntu x86_64 源码编译 rust 1.48.0
    竖式问题 rust解法
    亚马逊收到CPSC查验通知后卖家需要怎么弄?ASTM F963标准测试 ,CPC认证
    从0开始学习JavaScript--JavaScript使用Promise
    入门人工智能 —— 学习条件语句、循环语句、使用 Python 的数据结构来存储和组织数据,例如列表、字典、集合(3)
    1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计
  • 原文地址:https://blog.csdn.net/l16756062003/article/details/124832040