使用C++開發(fā)一個串口讀寫軟件的實現(xiàn)步驟
引言
現(xiàn)階段仍然有很多地方都是用C++寫的,因此還是需要用到的,盡管現(xiàn)在都開始使用Rust來代替C++了,但Rust的別扭也是眾所周知的,在Rust中文社區(qū)就看到不少人因此選擇放棄Rust轉回C++了(反正不可能是我,我C++主要還是嵌入式和玩)。這倆貨,踩誰都不對,也沒有必要去捧誰,他們都是差不多的,比如說Rust難,C++就不難嗎?只不過是出來了從頭就開始難的Rust而已,Rust也有其相對比較簡單的地方。
C++到現(xiàn)在一直都是在發(fā)展的,對于關注C++的人來說,C++的新特性已經特別了解了,而我實際上也不過是個初學者(調庫小子)?,F(xiàn)在的C++已經發(fā)展的有點意思了,也有很多其他編程語言的特點,最主要是用起來沒有以前那么難了(不用vcpkg,cmake后好用多了)。
現(xiàn)在我就xmake(一個項目管理工具兼包管理工具)和asio2(一個asio的框架,可以實現(xiàn)輕松各種網絡應用,一般支持tcp,udp,http,websocket,rpc,ssl,icmp,serial_port.)來快速的開發(fā)個串口讀寫軟件(整合例程)。
一、必要條件
要想跟我一起開始做,你需要完成兩件事
- 安裝好c++開發(fā)環(huán)境(我是Linux,其實什么操作系統(tǒng)都可以)
- 安裝好xmake
- 安裝好vscode
- 安裝好vscode的cpp拓展包
- 安裝好vscode的xmake拓展
確保滿足以上條件后開始。
二、實現(xiàn)步驟
1.創(chuàng)建項目
首先是創(chuàng)建項目,xmake創(chuàng)建項目的命令如下(項目名c_serial_demo)
xmake create c_serial_demo
然后用vscode打開這個文件夾,里面有兩個文件
- src - 用來存放你的源代碼
- xmake.lua - xmake的配置文件
2.配置代碼提示
首先要生成cpp代碼提示的配置文件,按下ctrl + shift + p
,輸入c/c++,選擇輸入c/c++編輯配置(UI)
,然后關掉這個頁面就好了,就會看到在.vscode
下面多出個文件c_cpp_properties.json
就成功了。
然后是生成xmake的代碼編譯命令文件,按下ctrl + shift + p
,輸入xmake,選擇xmake:UpdateIntellisense
,就會看到在.vscode
下面多出個文件compile_commands.json
就成功了。
最后在c_cpp_properties.json
中的configurations
中寫入"compileCommands": ".vscode/compile_commands.json"
,寫完后就像下面這個樣子
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**" ], "defines": [], "compilerPath": "/usr/lib64/ccache/clang", "cStandard": "c17", "cppStandard": "c++17", "compileCommands": ".vscode/compile_commands.json" } ], "version": 4 }
此時保存后代碼提示就沒問題了。
3.安裝依賴
本程序只是實現(xiàn)串口讀寫,并且是打算直接調庫快速實現(xiàn),因此直接安裝依賴就好了,首先執(zhí)行安裝依賴的命令
xrepo install asio2
然后修改配置文件xmake.lua
,添加以下行
add_rules("mode.debug", "mode.release") add_requires("asio2") -- 添加這行 1 target("c_serial_demo") set_kind("binary") add_files("src/*.cpp") add_packages("asio2") -- 添加這行 2
3.編譯程序
xmake的編譯運行很簡單,編譯就是直接運行
xmake # 或者 xmake build
運行就是
xmake run
此時運行你應該可以看到Hello World
4. 編寫實現(xiàn)代碼
asio2的github上有很多示例代碼,由于這里只使用串口讀寫,因此直接把serial_port的代碼拿過來用就好了,有興趣可以去github看看,我這里直接貼出來
#include <asio2/serial_port/serial_port.hpp> int main() { std::string_view device = "COM1"; // for windows //std::string_view device = "/dev/ttyS0"; // for linux std::string_view baud_rate = "9600"; asio2::serial_port sp; sp.bind_init([&]() { // Set other serial port parameters at here sp.set_option(asio::serial_port::flow_control(asio::serial_port::flow_control::type::none)); sp.set_option(asio::serial_port::parity(asio::serial_port::parity::type::none)); sp.set_option(asio::serial_port::stop_bits(asio::serial_port::stop_bits::type::one)); sp.set_option(asio::serial_port::character_size(8)); }).bind_recv([&](std::string_view data) { printf("recv : %zu %.*s\n", data.size(), (int)data.size(), data.data()); sp.async_send(data); }).bind_start([&]() { printf("start : %d %s\n", asio2::last_error_val(), asio2::last_error_msg().c_str()); }).bind_stop([&]() { printf("stop : %d %s\n", asio2::last_error_val(), asio2::last_error_msg().c_str()); }); //sp.start(device, baud_rate); sp.start(device, baud_rate, '\n'); //sp.start(device, baud_rate, "\r\n"); //sp.start(device, baud_rate, match_role); //sp.start(device, baud_rate, asio::transfer_at_least(1)); //sp.start(device, baud_rate, asio::transfer_exactly(10)); sp.async_send("abc0123456789xyz\n", [](std::size_t bytes_sent) { printf("send : %zu %d %s\n", bytes_sent, asio2::last_error_val(), asio2::last_error_msg().c_str()); }); while (std::getchar() != '\n'); return 0; }
將以上代碼直接替換到main.cpp即可,其中device根據(jù)你的操作系統(tǒng)來寫(Windows還是Linux,這個庫是可以直接跨平臺的),然后波特率就是baud_rate,根據(jù)你的情況來編寫,現(xiàn)在編譯運行,應該是能看到默認輸出的一些東西,現(xiàn)在只要連接個單片機到這個串口,或者使用usb轉串口,連接上以后就可以正??吹捷敵隽耍热?/p>
此時你可以根據(jù)你想要的業(yè)務邏輯來編寫你的代碼,實現(xiàn)你想要的功能,使用xmake來做c++開發(fā)就跟python差不多,如果你想要實現(xiàn)什么功能,直接調庫就好了,C++擁有海量的庫,對于一些系統(tǒng)操作也很方便,所以我一般喜歡用C++玩。
以上就是使用C++開發(fā)一個串口讀寫軟件的實現(xiàn)步驟的詳細內容,更多關于C++串口讀寫軟件的資料請關注腳本之家其它相關文章!
相關文章
c++ 類函數(shù)作為模板參數(shù)實現(xiàn)方式詳解
這篇文章主要介紹了c++ 類函數(shù)作為模板參數(shù)實現(xiàn)方式,在實現(xiàn)中加入增強邏輯,這種方式對代碼侵入性過高,而且無法控制該邏輯是否需要,如果不需要的話又得重新修改代碼實現(xiàn),需要的朋友可以參考下2023-03-03C語言 以數(shù)據(jù)塊的形式讀寫文件詳解及實現(xiàn)代碼
本文主要介紹 C語言 以數(shù)據(jù)塊的形式讀寫文件,這里對相關知識資料做了整理,并附代碼示例,以便大家學習參考,有學習此部分知識的朋友可以參考下2016-08-08