【现代C++开发】使用现代的C++快速开发一款串口读写软件

在这里插入图片描述

文章目录

  • 前言
  • 一、必要条件
  • 二、实现步骤
    • 1.创建项目
    • 2.配置代码提示
    • 3.安装依赖
    • 3.编译程序
    • 4. 编写实现代码


前言

最近关于C++闹出来的动静态势挺大的,主要是由于爱美丽卡开始抵制C++,最近有不少文章都报道了这件事,比如
在这里插入图片描述
即使C++到了这个时候,C++也还是值得学习的,起码

不管你用起来体验怎么样,反正我开发的爽。

现阶段仍然有很多地方都是用C++写的,因此还是需要用到的,尽管现在都开始使用Rust来代替C++了,但Rust的别扭也是众所周知的,在Rust中文社区就看到不少人因此选择放弃Rust转回C++了(反正不可能是我,我C++主要还是嵌入式和玩)。这俩货,踩谁都不对,也没有必要去捧谁,他们都是差不多的,比如说Rust难,C++就不难吗?只不过是出来了从头就开始难的Rust而已,Rust也有其相对比较简单的地方。

C++到现在一直都是在发展的,对于关注C++的人来说,C++的新特性已经特别了解了,而我实际上也不过是个初学者(调库小子)。现在的C++已经发展的有点意思了,也有很多其他编程语言的特点,最主要是用起来没有以前那么难了(不用vcpkg,cmake后好用多了)。

现在我就xmake(一个项目管理工具兼包管理工具)和asio2(一个asio的框架,可以实现轻松各种网络应用,一般支持tcp,udp,http,websocket,rpc,ssl,icmp,serial_port.)来快速的开发个串口读写软件(整合例程)。

一、必要条件

要想跟我一起开始做,你需要完成两件事

  1. 安装好c++开发环境(我是Linux,其实什么操作系统都可以)
  2. 安装好xmake
  3. 安装好vscode
  4. 安装好vscode的cpp拓展包
  5. 安装好vscode的xmake拓展

确保满足以上条件后开始。

二、实现步骤

1.创建项目

首先是创建项目,xmake创建项目的命令如下(项目名c_serial_demo)

xmake create c_serial_demo

然后用vscode打开这个文件夹,里面有两个文件

  1. src - 用来存放你的源代码
  2. 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.安装依赖

本程序只是实现串口读写,并且是打算直接调库快速实现,因此直接安装依赖就好了,首先执行安装依赖的命令

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. 编写实现代码

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根据你的操作系统来写(Windows还是Linux,这个库是可以直接跨平台的),然后波特率就是baud_rate,根据你的情况来编写,现在编译运行,应该是能看到默认输出的一些东西,现在只要连接个单片机到这个串口,或者使用usb转串口,连接上以后就可以正常看到输出了,比如
在这里插入图片描述
此时你可以根据你想要的业务逻辑来编写你的代码,实现你想要的功能,使用xmake来做c++开发就跟python差不多,如果你想要实现什么功能,直接调库就好了,C++拥有海量的库,对于一些系统操作也很方便,所以我一般喜欢用C++玩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938752.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux上qt打包(二)

sudo apt install git 新建一个文件夹 名为xiazai&#xff0c; chmod -R 777 xiazai cd xiazai 并进入这个文件夹&#xff0c;然后clone git clone https://github.com/probonopd/linuxdeployqt.git 此处可能要fanQiang才能下 cd linuxdeployqt文件夹 下载平台需要的…

电脑开机提示error loading operating system怎么修复?

前一天电脑还能正常运行&#xff0c;但今天启动时却显示“Error loading operating system”&#xff08;加载操作系统错误&#xff09;。我已经仔细检查了硬盘、接线、内存、CPU和电源&#xff0c;确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用&#xff0c;说明不是硬…

Nginx 在不同操作系统下的安装指南

Nginx 在不同操作系统下的安装指南 一、Linux 系统下 Nginx 的安装 &#xff08;一&#xff09;基于 Ubuntu 系统 更新软件包列表 打开终端&#xff0c;首先执行sudo apt-get update命令。这一步是为了确保系统的软件包列表是最新的&#xff0c;能够获取到最新版本的 Nginx 及…

NTLMv2 离线爆破

攻击者&#xff08;kali&#xff09;&#xff1a;192.168.72.162 受害者&#xff08;administrator&#xff09;&#xff1a;192.168.72.163 因为 NTLM 身份验证是通过计算正确的挑战值得出的&#xff0c;所以如果我们能获取域用户的 NTLM 认证某一服务的 Net-NTLM v2 Hash …

“TA”说|表数据备份还原:SQLark 百灵连接助力项目部署验收

&#x1f4ac; 南飞雁&#xff5c;应用开发工程师 有些重要项目的部署验收&#xff0c;会在生产环境完成&#xff0c;验收完成后&#xff0c;又需要把这部分数据清空。这时就需要对数据表进行备份和还原&#xff0c;虽然可以通过命令直接实现&#xff0c;但是有一些操作门槛&am…

C++动态规划解决最长公共子序列

动规非常经典的一道题目&#xff0c;由于需要用到二维数组——姑且算为中等难度的题目&#xff0c;其实和01背包有着极高的相似度&#xff0c;无论是实现还是理论。 今天这篇博客不讲过多的DP理论&#xff0c;重在讲解题目本身。其实有一定经验的同志都清楚&#xff0c;DP的难点…

Meta升级Ray-Ban智能眼镜:新增实时AI对话与翻译功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

visual studio添加滚动条预览

如何在vs中添加如图的滚动条呢&#xff1f; 打开VS 工具栏 选项 - 文本编辑器 - C/C - 滚动条 行为-使用缩略图 -- 确定

VUE利用一句话复刻实现变声功能

实现思路&#xff1a;利用语音听写实现语音输入---拿到文字后自动调用一句话复刻实现声音输出。最终效果是A输入语音能够转换成B的语音输出。 <template><div class"One-container"><div><hr/><!--发音音色列表展示--><el-row :gut…

Firefly: 大模型训练工具,命令行执行训练,没有界面

文章目录 GitHub地址参数说明训练命令 Firefly: 大模型训练工具&#xff0c;支持训练Qwen2.5、Qwen2、Yi1.5、Phi-3、Llama3、Gemma、MiniCPM、Yi、Deepseek、Orion、Xverse、Mixtral-8x7B、Zephyr、Mistral、Baichuan2、Llma2、Llama、Qwen、Baichuan、ChatGLM2、InternLM、Zi…

自动驾驶AVM环视算法--python版本的俯视碗型投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--3D碗型投影模式的exe测试工具》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1STjUd87_5wDk_C…

汽车供应链 “剧变”开始,“智能感知潜在龙头”诞生

智能汽车产业链“剧变”已经开启&#xff0c;智能感知软硬件能力的权重正在不断被放大。 比如满足高阶泊车的第二代AK2超声波传感器、满足人机共驾场景需求的电子外后视镜&#xff08;CMS&#xff09;、iTOF 3D成像视觉感知&#xff08;用于舱内监控&#xff09;等新产品&…

计算机网络——期末复习(2)1-3章考试重点

第一章 概述 1、发送时延&#xff0c;其中数据帧长度为数据块大小1B8位 2、传播时延 3、 第二章 物理层 1、奈氏准则&#xff1a;理想低通信道的最高码元传输速率2W&#xff0c;W为理想低通信道的频率带宽 2、香农公式&#xff1a;&#xff0c;C为信道的极限信息传输速率&…

C++算法第九天

本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 暴力解法 二分解法 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 重点回顾 朴素二分 非朴素二分 重点一 重点二 重点三 第一题 题目链接 153. 寻找旋转排序数组中的最小值 - 力…

HarmonyOS 实时监听与获取 Wi-Fi 信息

文章目录 摘要项目功能概述代码模块详细说明创建 Wi-Fi 状态保存对象Wi-Fi 状态监听模块获取当前 Wi-Fi 信息整合主模块 运行效果展示性能分析总结 摘要 本文展示了如何使用 HarmonyOS 框架开发一个 Demo&#xff0c;用于监听手机的 Wi-Fi 状态变化并实时获取连接的 Wi-Fi 信息…

gpu硬件架构

1.简介 NVIDIA在视觉计算和人工智能&#xff08;AI&#xff09;领域处于领先地位&#xff1b;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论&#xff0c;但很难掌握各种组件的清晰完整的图景。 这些GPU的高性…

【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget

目录 QLabel QFrame 例子&#xff1a; textFormat pixmap、scaledContents alignment wordWrap、indent、margin buddy QLCDNumber 例子&#xff1a; QTimer QProgressBar 例子&#xff1a; QCalendarWidget 例子&#xff1a; QLabel 标签控件&#xff0c;用来显示…

0001.基于springmvc简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习&#xff0c;虽然版本比较老但是部署方便&#xff0c;tomcat环境即可启用&#xff1b;代码简洁&#xff0c;前后端代码提供可统一学习&#xff1b;祝愿您能成尽快为一位合格的程序员&#xff0c;愿世界没有BUG; …

Wallpaper壁纸制作学习记录12

角色表 创建人偶变形动画的更高级方法可以使用角色表来完成。角色表要求您使用角色的切割版本&#xff0c;将您的角色分成不同肢体/部分。这允许创建更复杂、更准确的动画&#xff0c;因为部分可以自由移动和重叠&#xff0c;而不会使图像失真。使用操控变形不一定能获得良好的…

【Python项目】基于Django的语音和背景音乐分离系统

【Python项目】基于Django的语音和背景音乐分离系统 技术简介&#xff1a;采用Python技术、Django框架、B/S结构&#xff0c;MYSQL数据库等实现。 系统简介&#xff1a;系统完成在线的音频上传&#xff0c;并且通过计算机的神经网络算法来对系统中的背景音乐和人声进行分离操作…