嘮嗑一下
在我接觸STM32單片機開發的時候,我的第一個小demo就是點亮和熄滅一個燈,在我眼中,燈的一開一滅也暗合的現代計算機的運算本質,就是處理0和1這兩個二進制數,在后來,每一次轉變學習方向的時候,我的第一個小demo總是實作0和1的切換,包括在實驗的程序中,通過實作0和1進行替換,可以很方便的初步驗證方法是否有效,(其實就是懶,Hello World有點長了,)
ROS上位機向STM32發送一個字符
既然是通過串口進行通訊,那么首先第一步就是配置的串口通訊等引數,為了能夠讓主程式更加清晰明了,這里將配置資訊進行打包,
打包程式: serial_header.cpp
#include "serial_header.h"
using namespace std;
using namespace boost::asio;
//串口相關物件
boost::asio::io_service iosev;
boost::asio::serial_port sp(iosev, "/dev/ttyUSB0");
//"/dev/ttyUSB0"當你需要多個串口通訊設備同時使用時,需要進行自定義,
boost::system::error_code err;
/********************************************************
函式功能:串口引數初始化
入口引數:無
出口引數:
********************************************************/
void serialInit()
{
sp.set_option(serial_port::baud_rate(9600));
sp.set_option(serial_port::flow_control(serial_port::flow_control::none));
sp.set_option(serial_port::parity(serial_port::parity::none));
sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
sp.set_option(serial_port::character_size(8));
}
/********************************************************
函式功能:將資料打包發送給下位機
入口引數:資料
出口引數:
********************************************************/
void write(char x)
{
unsigned char buf[1];//資料發送快取陣列
buf[0] = x;//將資料轉存至buf[0]中
boost::asio::write(sp, boost::asio::buffer(buf));// 通過串口下發資料
}
自定義頭檔案: serial_header.h
#ifndef MBOT_LINUX_SERIAL_H
#define MBOT_LINUX_SERIAL_H
#include <ros/ros.h>
#include <ros/time.h>
#include <geometry_msgs/TransformStamped.h>//坐標變換相關頭檔案
#include <tf/transform_broadcaster.h>//坐標變換相關頭檔案
#include <nav_msgs/Odometry.h>//里程計資訊頭檔案
#include <boost/asio.hpp>//串口asio頭檔案
#include <geometry_msgs/Twist.h>//后面的速度控制需要用到
extern void serialInit();//串口初始化
extern void write(char x);//寫入資料
#endif
執行程式: serial.cpp
#include<ros/ros.h>
#include"serial_header.h"
const char* control;
char out ;
int main(int argc, char **argv)
{
//初始化ROS節點
ros::init(argc, argv, "teleop_subscriber");
//創建句柄節點
ros::NodeHandle n;
//設定延時時間
ros::Rate loop_rate(10);
//串口初始化,參考自頭檔案learn_linux_serial.h,即獲取同名cpp檔案中的serialInit()函式,
serialInit();
control = "1";//將1塞入到control中
while(1)
{
out = control[0];//將“1”塞入到out中
write(out);//呼叫函式write,并傳遞值out
ROS_INFO("out:%c",out);//列印看一下這個out是不是“1”咯
loop_rate.sleep();//按照一定回圈頻率延時
}
//回圈等待函式
ros::spin();
return 0;
}
這里建議一開始先從看ROS_INFO的顯示資料開始,注釋掉“write(out);”等,看看每一步有什么用處,能夠更好的幫助你理解他作用,多用ROS_INFO這種列印日志的函式,查看資料是否有問題,如果能夠用VSCode,這種能夠單步運行的編譯器那就更好了,在單步運行的程序中可以更加清楚的看到資料的內在結構,當然,單步總是美好的,一旦連續運行又是另一回事了,
最后
有的朋友如果能力比較牛的話,大體上也已經能夠猜出如何實作讀取下位機(STM32)的資料了,可以在此基礎上嘗試一下,腦洞大開一下,如有錯誤,還請各位指正,謝謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404003.html
標籤:其他
上一篇:了解HTTP,一篇就夠了
下一篇:沒錯,我是高端吃瓜玩家
