<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • 讓人疑惑的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
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频