0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ROS與STM32串口通信代碼

麥辣雞腿堡 ? 來(lái)源:古月居 ? 作者:月照銀海似蛟龍 ? 2023-11-17 18:10 ? 次閱讀

這里以一個(gè)智能車代碼工程為例,抽取串口通信部分代碼

在頭文件中,進(jìn)行串口頭文件的包含

#include < serial/serial.h >

在類的定義中,什么一個(gè) serial 類的實(shí)例

serial::Serial Stm32_Serial;  //聲明串口對(duì)象

并且在類的定義中,聲明兩個(gè)結(jié)構(gòu)體,用來(lái)存儲(chǔ)接收和要發(fā)送的數(shù)據(jù)

RECEIVE_DATA Receive_Data; //The serial port receives the data structure //串口接收數(shù)據(jù)結(jié)構(gòu)體
SEND_DATA Send_Data;       //The serial port sends the data structure //串口發(fā)送數(shù)據(jù)結(jié)構(gòu)體

在類的構(gòu)造函數(shù)中,配置這個(gè)串口對(duì)象的參數(shù)

private_nh.param< std::string >("usart_port_name",  usart_port_name,  "/dev/stm32_controller"); //Fixed serial port number //固定串口號(hào)
  private_nh.param< int >        ("serial_baud_rate", serial_baud_rate, 115200); //Communicate baud rate 115200 to the lower machine //和下位機(jī)通信波特率115200

這兩個(gè)參數(shù)是在launch文件中設(shè)置的,代碼里進(jìn)行參數(shù)的讀取。

usart_port_name 設(shè)置的USB設(shè)備別名

serial_baud_rate 串口通信的波特率要和stm32設(shè)置的一致

try
  { 
    //Attempts to initialize and open the serial port //嘗試初始化與開啟串口
    Stm32_Serial.setPort(usart_port_name); //Select the serial port number to enable //選擇要開啟的串口號(hào)
    Stm32_Serial.setBaudrate(serial_baud_rate); //Set the baud rate //設(shè)置波特率
    serial::Timeout _time = serial::Timeout::simpleTimeout(2000); //Timeout //超時(shí)等待
    Stm32_Serial.setTimeout(_time);
    Stm32_Serial.open(); //Open the serial port //開啟串口
  }
  catch (serial::IOException& e)
  {
    ROS_ERROR_STREAM("car_robot can not open serial port,Please check the serial port cable! "); //If opening the serial port fails, an error message is printed //如果開啟串口失敗,打印錯(cuò)誤信息
  }

初始化串口配置,并開啟串口

設(shè)置的參數(shù)包括:

  • 要開啟的串口號(hào)
  • 設(shè)置波特率
  • 超時(shí)等待

判斷串口是否被打開,打開輸出終端打印信息

if(Stm32_Serial.isOpen())
  {
    ROS_INFO_STREAM("car_robot serial port opened"); //Serial port opened successfully //串口開啟成功提示
  }

ROS主控讀取stm32發(fā)送的數(shù)據(jù)

之后便可以通過

Stm32_Serial.read(Receive_Data_Pr,sizeof(Receive_Data_Pr));

read函數(shù)讀取串口接收到的字節(jié),之后通過定義的通信協(xié)議再進(jìn)行和校驗(yàn)與數(shù)據(jù)解析即可stm32向ROS主控發(fā)送數(shù)據(jù)。

ROS主控向stm32發(fā)送數(shù)據(jù)

ROS主控向stm32發(fā)送數(shù)據(jù)的代碼如下:

將之前定義的發(fā)送數(shù)據(jù)的結(jié)構(gòu)體 Send_Data的tx 中填入要發(fā)送的字節(jié)

Send_Data.tx[0]=FRAME_HEADER; //frame head 0x7B //幀頭0X7B
 Send_Data.tx[1] = 0; //set aside //預(yù)留位
 Send_Data.tx[2] = 0; //set aside //預(yù)留位

填好字節(jié)后,直接通過下面代碼發(fā)送即可

try
  {
    Stm32_Serial.write(Send_Data.tx,sizeof (Send_Data.tx)); //Sends data to the downloader via serial port //通過串口向下位機(jī)發(fā)送數(shù)據(jù) 
  }
  catch (serial::IOException& e)   
  {
    ROS_ERROR_STREAM("Unable to send data through serial port"); //If sending data fails, an error message is printed //如果發(fā)送數(shù)據(jù)失敗,打印錯(cuò)誤信息
  }
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16033

    瀏覽量

    176656
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10847

    瀏覽量

    353776
  • 智能車
    +關(guān)注

    關(guān)注

    21

    文章

    401

    瀏覽量

    76853
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16919
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    求大佬分享STM32串口通信配置源代碼分享

    求大佬分享STM32串口通信配置源代碼分享
    發(fā)表于 12-10 06:46

    如何完成ROSSTM32之間的串口通信

    如何去實(shí)現(xiàn)ROSSTM32串口通信測(cè)試功能?如何完成ROSSTM32之間的
    發(fā)表于 12-10 06:54

    stm32f407串口通信代碼

    stm32f407串口通信代碼 原理圖還有封裝 很清楚自己畫的
    發(fā)表于 03-21 17:22 ?0次下載

    STM32串口通信數(shù)據(jù)亂碼的相關(guān)問題

    STM32串口通信以及溫度采集搞定,其中主要遇到STM32系列單片機(jī)時(shí)鐘樹的問題,串口通信遇到
    發(fā)表于 06-22 08:01 ?1.2w次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>數(shù)據(jù)亂碼的相關(guān)問題

    STM32串口通訊

    STM32串口通訊USART串口通信實(shí)踐USART串口通信實(shí)踐1、實(shí)驗(yàn)環(huán)境參考資料 野火官
    發(fā)表于 12-06 20:21 ?13次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通訊

    STM32串口通信

    STM32串口通信串口通信簡(jiǎn)介編程代碼注意:本文參考STM3
    發(fā)表于 12-07 09:36 ?15次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    Stm32串口通信基礎(chǔ)實(shí)驗(yàn)

    目錄二、stm32串口通信二級(jí)目錄三級(jí)目錄二、stm32串口通信1.本次實(shí)驗(yàn)使用的是
    發(fā)表于 12-07 09:36 ?32次下載
    <b class='flag-5'>Stm32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>基礎(chǔ)實(shí)驗(yàn)

    初步了解STM32串口通訊

    STM32串口通訊一、基于寄存器與基于固件庫(kù)的編程方式的差異二、stm32串口通信實(shí)戰(zhàn)1、燒錄代碼
    發(fā)表于 12-07 09:51 ?13次下載
    初步了解<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通訊

    "2個(gè)STM32串口之間的串口通信(RX,TX)"

    "2個(gè)STM32串口之間的串口通信(RX,TX)"
    發(fā)表于 12-09 17:21 ?83次下載
    "2個(gè)<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>之間的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>(RX,TX)"

    【嵌入式】STM32串口通信

    【嵌入式】STM32串口通信一、串口通信協(xié)議1.串口通信
    發(fā)表于 12-20 19:29 ?17次下載
    【嵌入式】<b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    stm32串口代碼詳解

    stm32串口
    發(fā)表于 12-24 18:38 ?52次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>串口</b><b class='flag-5'>代碼</b>詳解

    STM32串口通信

    STM32串口通信串口通信簡(jiǎn)介編程代碼注意:本文參考STM3
    發(fā)表于 01-14 13:47 ?12次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    STM32串口通信簡(jiǎn)明知識(shí)

    STM32串口通信簡(jiǎn)明知識(shí)
    的頭像 發(fā)表于 10-25 15:48 ?1217次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>簡(jiǎn)明知識(shí)

    利用Simulink自動(dòng)生成STM32串口代碼

    功能:利用Simulink自動(dòng)生成STM32串口代碼,在Keil中編譯后直接下載到主芯片,實(shí)現(xiàn)串口通訊的功能。
    的頭像 發(fā)表于 10-25 17:04 ?1648次閱讀
    利用Simulink自動(dòng)生成<b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>代碼</b>

    智能車ROSSTM32串口通信代碼

    這里以一個(gè)智能車代碼工程為例,抽取串口通信部分代碼 在頭文件中,進(jìn)行串口頭文件的包含 # include 在類的定義中,什么一個(gè) seria
    的頭像 發(fā)表于 11-26 17:47 ?1081次閱讀