c++通過serial庫進行上下位機通信

?編輯

風紊

現役大學牲,半退休robomaster視覺隊員

寫在前面

本文章主要介紹的是如何通過開源的serial庫和虛擬串口實現上位機和下位機通信。

需求

假設下位機有這樣一個數據報發送給上位機

struct DataRecv {char start = 's';TeamColor color = TeamColor::Blue;Mode mode = Mode::Armor;float speed = 20;float euler[3] = {};  //(0,1,2) = (yaw,roll,pitch)char shoot_bool = 0;char RuneFlag = 0;    char unused[10] = {};char end = 'e';
}//TeamColor是一個char類型的迭代類,Mode也是一個char類型的迭代類

其他數據我都不需要,只需要歐拉角,也就是一個浮點數數組,euler[3]

解決方法

serial庫的github倉庫

先clone下來,安裝,得到頭文件和動態庫。

我們來看看serial庫的構造函數:

class Serial {
public:/*!* Creates a Serial object and opens the port if a port is specified,* otherwise it remains closed until serial::Serial::open is called.** \param port A std::string containing the address of the serial port,*        which would be something like 'COM1' on Windows and '/dev/ttyS0'*        on Linux.** \param baudrate An unsigned 32-bit integer that represents the baudrate** \param timeout A serial::Timeout struct that defines the timeout* conditions for the serial port. \see serial::Timeout** \param bytesize Size of each byte in the serial transmission of data,* default is eightbits, possible values are: fivebits, sixbits, sevenbits,* eightbits** \param parity Method of parity, default is parity_none, possible values* are: parity_none, parity_odd, parity_even** \param stopbits Number of stop bits used, default is stopbits_one,* possible values are: stopbits_one, stopbits_one_point_five, stopbits_two** \param flowcontrol Type of flowcontrol used, default is* flowcontrol_none, possible values are: flowcontrol_none,* flowcontrol_software, flowcontrol_hardware** \throw serial::PortNotOpenedException* \throw serial::IOException* \throw std::invalid_argument*/Serial (const std::string &port = ""                  //需要打開的端口uint32_t baudrate = 9600,                     //設置波特率,缺省值位9600Timeout timeout = Timeout(),                  //打開超時的時間,缺省值時間為0bytesize_t bytesize = eightbits,              //字節大小,缺省值位8位parity_t parity = parity_none,                //奇偶校驗位,默認無奇偶校驗stopbits_t stopbits = stopbits_one,           //停止位,缺省值為1位flowcontrol_t flowcontrol = flowcontrol_none);//流控制,默認五流控制,可選擇軟件流控制和硬件流控制

選項都設置好后,直接調用對象的open()方法就能打開串口通信。

讀數據的方法:

size_t
Serial::read (uint8_t *buffer, size_t size)
{ScopedReadLock lock(this->pimpl_);return this->pimpl_->read (buffer, size);
}

所以我們只需要將數據包轉為uint8_t的類型的存儲格式指針,傳給函數,并指定字節數size就能讀取數據了。

通信實現文件test.cpp的代碼

#include <serial/serial.h>
#include <iostream>struct data_package
{char start = 's';char unused1[2];float speed = 20;float euler[3] = {}; //(0,1,2) = (yaw,roll,pitch)char shoot_bool = 0;char RuneFlag = 0; //char unused2[10] = {};char end = 'e';
} __attribute__((packed));
static_assert(sizeof(data_package) == 32);data_package data;
int main()
{std::cout << "helloworld" << std::endl;serial::Serial ser; // 實例化一個串口的對象ser.setPort("/dev/serial_sdk"); // 設置串口設備ser.setBaudrate(115200);        // 設置波特率try{ser.open(); // 打開串口while (true){std::cout << "number" << ser.available() << std::endl; // 讀取到緩存區數據的字節數ser.read(reinterpret_cast<uint8_t *>(&data), 32);//將data_package類型結構體強制轉換位uint8_t類型的指針,來接收32字節的數據std::cout << data.start << data.unused1[0] << data.unused1[1] << std::endl;std::cout << "(yaw,pitch,roll)" << data.euler[0] << " " << data.euler[1] << " " << data.euler[2] << std::endl;}}catch (std::exception &e){std::cerr << e.what() << std::endl;}
}

使用g++編譯代碼失敗的話,可以參考關于庫不在默認搜索路徑時,g++鏈接庫時找不到函數實現的問題。

如果要給設備起別名,可以參考Linux下給外部掛載的設備起別名,而不使用內核名稱

Notice

如果結構體最后不接?attribute((packed)),經筆者測試,數據包大小變為36位。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209784.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Premiere Pro 2024 新功能有哪些?視頻剪輯軟件PR2024更新內容及問題修復

PR軟件“基于文本的編輯”中的填充詞檢測與批量刪除功能 “基于文本的編輯”可讓您檢測“呃”和“嗯”填充詞并批量刪除它們&#xff0c;從而使您的轉錄文本更加準確。就像處理停頓一樣&#xff0c;您可以單擊填充詞并將其從序列轉錄文本中刪除。填充詞與語言無關&#xff0c;…

STM32CubeIDE(CUBE-MX hal庫)----RTC時鐘,時鐘實時顯示

系列文章目錄 STM32CubeIDE(CUBE-MX hal庫)----初嘗點亮小燈 STM32CubeIDE(CUBE-MX hal庫)----按鍵控制 STM32CubeIDE(CUBE-MX hal庫)----串口通信 STM32CubeIDE(CUBE-MX hal庫)----定時器 STM32CubeIDE(CUBE-MX hal庫)----藍牙模塊HC-05&#xff08;詳細配置&#xff09; 前言…

【無標題】安裝環境

這里寫目錄標題 清華鏡像加速 安裝cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果沒有可以點Previous pyTorch Versions&#xff0c;這里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 復制非空文件夾cp: -r not specif…

傳染病傳播速度

題干 R0值是基本傳染數的簡稱&#xff0c;指的是在沒有采取任何干預措施的情況下&#xff0c;平均每位感染者在傳染期內使易感者個體致病的數量。數字越大說明傳播能力越強&#xff0c;控制難度越大。一個人傳染的人的數量可以用冪運算來計算。假設奧密克戎的R0為10&#xff0…

《LeetCode力扣練習》代碼隨想錄——字符串(翻轉字符串里的單詞---Java)

《LeetCode力扣練習》代碼隨想錄——字符串&#xff08;翻轉字符串里的單詞—Java&#xff09; 刷題思路來源于 代碼隨想錄 151. 反轉字符串中的單詞 雙指針 class Solution {public String reverseWords(String s) {char[] results.toCharArray();resultremoveSpace(result);r…

2023-12-05 Qt學習總結2

點擊 <C 語言編程核心突破> 快速C語言入門 Qt學習總結 前言五 Hello Qt!六 Qt控件和事件七 Qt信號和槽八 Qt自定義信號和槽總結 前言 要解決問題: 學習qt最核心知識, 多一個都不學. 五 Hello Qt! 現在我們已經有了一個空窗口工程, 傳統上, 我們要實現一個"Hello …

(三潮來襲)探尋2023年科技變革潮流與2024年前瞻展望

2023年對于IT行業來說是一個動蕩而又充滿變革的一年。隨著世界逐漸走出前幾年的挑戰&#xff0c;企業逐漸復蘇&#xff0c;但這個行業仍然在經歷著激烈的變革。在這個時候&#xff0c;我們看到了一些引人注目的技術變化和未來的趨勢。 一、2023年回顧 關鍵詞&#xff1a;Chat…

構建Servlet項目流程

第一步&#xff1a;創建maven項目 部分基礎 依賴的模板基礎部分如下 maven-archetype-quickstart: 這是最基本的Archetype&#xff0c;它創建一個包含簡單Java類和單元測試的項目。 maven-archetype-webapp: 這個Archetype創建一個簡單的Java web應用&#xff0c;包括一個serv…

【C++】算法庫(批量操作、搜索操作)

C算法庫 文章目錄 C算法庫批量操作for_eachfor_each_n 搜索操作all_of ,any_of ,none_offind, find_if, find_if_notfind_endstd::find_first_ofadjacent_findcount, count_ifequalsearchsearch_n 算法庫提供大量用途的函數&#xff08;例如查找、排序、計數、操作&#xff09;…

微信小程序 - PC端選擇ZIP文件

微信小程序 - PC端選擇文件 分享代碼片段場景分析解決思路附魔腳本chooseMediaZip 選擇附魔后的ZIP文件相關方法測試方法 參考資料 分享代碼片段 不想聽廢話的&#xff0c;直接看代碼。 https://developers.weixin.qq.com/s/UL9aojmn7iNU 場景分析 如果你的微信小程序需要選…

TypeScript入門實戰筆記 -- 開篇 為什么要選擇 TypeScript ?

typescript 在線編輯器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

openEuler學習05-kernel升級

周末沒事&#xff0c;嘗試下openEuler的kernel升級 [rootlocalhost ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)" ANSI_…

營收增速持續放緩,博通CEO期待AI崛起救場 | 百能云芯

博通作為蘋果等大型科技公司的芯片供應商&#xff0c;于周四發布了財報。盡管截至10月29日的第四季度營收增長了4%至93億美元&#xff0c;符合市場預期&#xff0c;但增速已經降至2020年以來的最低水平。 由于企業客戶和電信供應商在控制支出方面的謹慎態度&#xff0c;博通的銷…

IDEA構建springBoot新項目時JDK只有17和21,無法選擇JDK8解決方案

今天創建springboot新項目時&#xff0c;發現IDEA里JDK選項只有17和21&#xff0c;無法選擇本機的JDK8&#xff0c;網上查資料后發現是springboot2.7于11.24號后停止維護&#xff0c;基于2.7和java8的spring Initializ官方不再維護&#xff0c;解決方案是在server URL欄&#x…

東北大學Python

目前金屬礦開采&#xff0c;爆破還是主要的破巖方式&#xff0c;為了保證巷道采場的安全&#xff0c;需要對爆破震動進行監測&#xff0c;獲取的監測數據如附件&#xff0c;第1列數據為震動的序號&#xff0c;第2、3、4列為x,y,z三個方向的震動速度&#xff0c;往往由于各種因素…

C++ 運算符重載與操作符重載

目錄 運算符重載 運算符重載的特性 其他運算符重載的實現 默認成員函數——賦值運算符重載 默認成員函數——取地址操作符重載 const成員 附錄 運算符重載 C為了增強代碼的可讀性引入了運算符重載&#xff0c;運算符重載是具有特殊函數名的函數&#xff0c;也具有其返回…

使用Vue實現一個當鼠標懸浮時出現,鼠標離開時消失的雙層菜單

前言 分享一個基于Vue實現一個當鼠標懸浮時出現&#xff0c;鼠標離開時消失的雙層菜單。同時也是為了以后需要類似的需求時&#xff0c;可以提供一個實現思路&#xff0c;以及可以快速ctrlc和ctrlv操作&#xff0c;提高工作效率~ 一、示例代碼 &#xff08;1&#xff09;/sr…

Linux C/C++ 分析網絡流量(十六進制TCP數據包分析)

在分析TCP數據包時&#xff0c;理解TCP協議的工作原理和報文格式是關鍵。TCP是一種面向連接的、提供可靠的、端到端的字節流傳輸服務。其頭部結構包括源端口、目標端口、序列號、確認應答號等字段。序列號是在建立連接時由計算機生成的隨機數作為初始值&#xff0c;每發送一次數…

使用Pytorch從零開始實現BERT

生成式建模知識回顧: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 變分自編碼器 [4] 生成對抗網絡&#xff0c;高級生成對抗網絡 I&#xff0c;高級生成對抗網絡 II [5] 自回歸模型 [6] 歸一化流模型 [7] 基于能量的模型 [8] 擴散模型 I, 擴散模型 II…