C++串口通信(转载)

Windows串口读取

要使用 C++ 读取串口数据,你需要使用串口编程库。在 Windows 平台上,可以使用 WinAPI 提供的串口编程接口。以下是一个简单的示例程序,用于打开 COM1 串口端口,读取数据并输出到控制台:

#include <iostream>
#include <windows.h>int main()
{HANDLE hSerial;DCB dcbSerialParams = { 0 };COMMTIMEOUTS timeouts = { 0 };DWORD bytesRead;// 打开 COM1 串口端口hSerial = CreateFile("COM1", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hSerial == INVALID_HANDLE_VALUE){std::cerr << "Error opening serial port." << std::endl;return 1;}// 配置串口参数dcbSerialParams.DCBlength = sizeof(dcbSerialParams);if (!GetCommState(hSerial, &dcbSerialParams)){std::cerr << "Error getting serial port state." << std::endl;CloseHandle(hSerial);return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.Parity = NOPARITY;dcbSerialParams.StopBits = ONESTOPBIT;if (!SetCommState(hSerial, &dcbSerialParams)){std::cerr << "Error setting serial port state." << std::endl;CloseHandle(hSerial);return 1;}// 配置串口超时时间timeouts.ReadIntervalTimeout = 50;timeouts.ReadTotalTimeoutConstant = 50;timeouts.ReadTotalTimeoutMultiplier = 10;timeouts.WriteTotalTimeoutConstant = 50;timeouts.WriteTotalTimeoutMultiplier = 10;if (!SetCommTimeouts(hSerial, &timeouts)){std::cerr << "Error setting serial port timeouts." << std::endl;CloseHandle(hSerial);return 1;}// 读取串口数据并输出到控制台char buffer[1024];while (true){if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)){std::cerr << "Error reading serial port." << std::endl;CloseHandle(hSerial);return 1;}if (bytesRead

Linux串口读取

在 Linux 上,你可以使用 POSIX 标准提供的串口编程接口。以下是一个简单的示例程序,用于打开 /dev/ttyS0 串口端口,读取数据并输出到控制台。

#include <iostream>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>int main()
{int fd;struct termios tty;char buffer[1024];ssize_t bytesRead;// 打开 /dev/ttyS0 串口端口fd = open("/dev/ttyS0", O_RDONLY | O_NOCTTY);if (fd == -1){std::cerr << "Error opening serial port." << std::endl;return 1;}// 配置串口参数if (tcgetattr(fd, &tty) != 0){std::cerr << "Error getting serial port attributes." << std::endl;close(fd);return 1;}cfsetospeed(&tty, B9600);cfsetispeed(&tty, B9600);tty.c_cflag |= (CLOCAL | CREAD);tty.c_cflag &= ~PARENB;tty.c_cflag &= ~CSTOPB;tty.c_cflag &= ~CSIZE;tty.c_cflag |= CS8;tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);tty.c_iflag &= ~(INPCK | ISTRIP);tty.c_oflag &= ~OPOST;tty.c_cc[VMIN] = 1;tty.c_cc[VTIME] = 0;if (tcsetattr(fd, TCSANOW, &tty) != 0){std::cerr << "Error setting serial port attributes." << std::endl;close(fd);return 1;}// 读取串口数据并输出到控制台while (true){bytesRead = read(fd, buffer, sizeof(buffer));if (bytesRead == -1){std::cerr << "Error reading serial port." << std::endl;close(fd);return 1;}if (bytesRead > 0){std::cout.write(buffer, bytesRead);}}// 关闭串口close(fd);return 0;
}

该程序使用 open() 打开 /dev/ttyS0 串口端口,使用 tcgetattr() 和 tcsetattr() 配置串口参数,并使用 read() 读取串口数据。

RS-232和RS-485的差别

在串口编程中,232 和 485 都是串口协议的一种,它们之间的物理层和数据链路层不同,因此它们需要的硬件和软件配置也不同。

在代码实现中,串口通信的核心是通过串口读取和发送数据,这部分代码不会因为串口协议的不同而有太大的变化。但是,不同的串口协议可能需要不同的初始化和配置。下面是一些可能需要考虑的区别:

  1. 波特率:在串口通信中,波特率指的是数据传输速率,通常用 bps 表示。232 和 485 通常支持的波特率范围是相同的,但具体的传输速率可能需要根据不同的设备或场景进行调整。
  2. 数据位、停止位、校验位:这些是串口通信中的数据格式,不同的设备或场景可能需要不同的数据格式。232 和 485 支持的数据格式是相同的,但在实际应用中可能需要进行不同的设置。
  3. 硬件控制流:硬件控制流可以通过 RTS 和 CTS 信号进行控制,常用于数据流控制。232 通常使用硬件流控,而 485 通常使用软件流控。
  4. 信号控制:485 在物理层上需要进行收发切换,而 232 不需要。因此,在代码实现上,485 通常需要对收发控制信号进行配置和控制,例如使用 GPIO 控制收发切换。

总之,虽然 232 和 485 的代码在细节上可能存在一些差异,但是它们的核心都是通过串口读取和发送数据。因此,通过理解串口通信的基本原理,我们可以根据具体的需求进行相应的调整和配置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoLong的学习之路,进阶,RabbitMQ (消息队列)

快有一周没有写博客了。前面几天正在做项目。正好&#xff0c;项目中需要MQ&#xff08;消息队列&#xff09;&#xff0c;这里我就补充一下我对mq的理解。其实在学习java中的时候&#xff0c;自己也仿照RabbitMQ自己实现了一个单机的mq&#xff0c;但是mq其中一个特点也就是&a…

基于ResNet18网络完成图像分类任务

目录 1 数据处理 1.1 数据集介绍 1.2 数据读取 1.3 构造Dataset类 2 模型构建 3 模型训练 4 模型评价 5 模型预测 6 什么是预训练模型和迁移学习 7 比较“使用预训练模型”和“不使用预训练模型”的效果。 总结 在本实践中&#xff0c;我们实践一个更通用的图像分类任务…

rust-flexi_logger

flexi_logger 是字节开源的rust日志库。目前有log4rs、env_log 等库&#xff0c;综合比较下来&#xff0c;还是flexi_logger简单容易上手&#xff0c;而且自定义很方便&#xff0c;以及在效率方面感觉也会高&#xff0c;下篇文章我们来测试下。 下面来看下怎么使用 关注 vx gol…

探索未来能源:可控核聚变的挑战与希望

探索未来能源:可控核聚变的挑战与希望 引言 随着人类社会的不断发展,对能源的需求也在持续增长。传统的化石燃料能源在燃烧过程中会产生大量的二氧化碳和其他温室气体,导致全球气候变暖,对环境产生了重大威胁。因此,寻找一种清洁、可持续、高效的能源成为了当务之急。在…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】单目视觉估计

目录 前言 算法原理 单目3D目标检测新网络 GUP module以及HTL 单目深度估计 数据集介绍 2.1 KITTI

Redis hash表源码解析

整体数据结构&#xff1a;链式hash解决hash冲突、采用渐进式hash来完成扩容过程。 /** 哈希表节点*/ typedef struct dictEntry {// 键void *key;// 值union {void *val;uint64_t u64;int64_t s64;} v;// 指向下个哈希表节点&#xff0c;形成链表struct dictEntry *next;} dict…

ubuntu22.04离线手动安装openstack yoga和ceph quincy

目录 写在前面材料准备一. OpenStack部1. 创建虚拟网络和虚拟机2. 配置离线环境3. 环境准备3.1 配置网络3.2 配置主机名并配置解析3.3 时间调整3.4 安装openstack客户端3.5 安装部署MariaDB3.6 安装部署RabbitMQ控制节点操作3.7 安装部署Memcache控制节点操作 4. 部署配置keyst…

TwinCAT3一个PLC设备里多个程序工程之间通讯

目录 1、创建TwinCAT3工程&#xff0c;再分别创建两个PLC程序工程 2、PLC1工程中添加如下代码&#xff0c;然后编译重新生成PLC1工程 3、PLC2工程中添加如下代码&#xff0c;然后编译重新生成PLC2工程 4、变量关联 5、一个PLC运行多个PLC工程设置 7、工程下载链接 1、创建…

配置中心--Spring Cloud Config

目录 概述 环境说明 步骤 创建远端git仓库 准备配置文件 配置中心--服务端 配置中心--客户端 配置中心的高可用 配置中心--服务端 配置中心--客户端 消息总线刷新配置 配置中心--服务端 配置中心--客户端 概述 因为微服务架构有很多个服务&#xff0c;手动一个一…

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…

同步加载、异步加载、延迟加载、预加载的区别

<link rel"preload" href"script1.js" as"script"> <link rel"preload" href"script2.js" as"script"> 同步加载&#xff1a;浏览器在遇到<script>标签时&#xff0c;会立即停止解析HTML&#…

【记录】Python|Python3程序测试速度的整个流程、方法对比和选取方式

参考&#xff1a;Python3.7中time模块的time()、perf_counter()和process_time()的区别 其他的博客太&#xff01;长&#xff01;了&#xff01;我实在看不下去了&#xff0c;每次都不记得什么场景用什么函数。 让我来用表格总结一下各个函数的使用场景、特性。 并附上分别的测…

【Java 基础】15 注解

文章目录 1.什么是注解2.元注解1&#xff09;定义2&#xff09;分类 3.内置注解4.自定义注解5.注解的基本语法6.验证注解是否生效7.注解的使用场景8.注解的注意事项结语 1.什么是注解 注解&#xff08;Annotation&#xff09;可以理解成一种特殊的 “注释” 注解定义时以 符号…

多线程06 单例模式,阻塞队列以及模拟实现

前言 上篇文章我们讲了wait和notify两个方法的使用.至此,多线程的一些基本操作就已经结束了,今天我们来谈谈多线程的一些简单应用场景. 单例模式 单例模式,顾名思义,只有一个实例的模式,我们有两种实现方式,分别是懒汉式和饿汉式,我们来分别给出代码. 饿汉式(此处的饿表示创建实…

json标签

json标签 json:"-" // 表示不进行序列化,忽略 json:"name,omitempty"//加上omitempty&#xff0c;可以在序列化的时候忽略0值或者空值&#xff1b;若要在被嵌套结构体整体为空时使其在序列化结果中被忽略&#xff0c;不仅要在被嵌套结构体字段后加json:“…

python程序内存泄漏的解决方法

笔者在实际应用过程中&#xff0c;利用python解析交易数据&#xff0c;其中的方法是对文件夹进行遍历&#xff0c;然后根据里面的每个文件进行单独的解析&#xff0c;也就是用到了多层循环&#xff0c;结果导致内存占用越来越大&#xff0c;以至于最终内存满了而程序崩溃退出。…

详解Spring中的Aop编程原理JDK动态代理和CGLIB动态代理

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

yolov8模型 onnxruntime推理及可视化

参考:https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-ONNXRuntime/main.py 1、yolov8 onnxruntime推理代码 1)导出参考:https://blog.csdn.net/weixin_42357472/article/details/131412851 2)查看保存的模型onnx的输入格式等信息 登录https://n…

MATLAB算法实战应用案例精讲-【深度学习】卷积神经网络

目录 前言 卷积神经网络发展历程 基于深度学习的计算机视觉与卷积神经网络 几个高频面试题目

使用PCReg.PyTorch项目训练自己的数据集进行点云配准

项目地址&#xff1a; https://github.com/zhulf0804/PCReg.PyTorch/tree/main 网络简介&#xff1a; 网络是基于PointNet Concat FC的&#xff0c;它没有其它复杂的结构&#xff0c;易于复现。因其简洁性&#xff0c;这里暂且把其称作点云配准的Benchmark。因作者源码中复杂…