Ubuntu系统基于C++编写一个串口工具16进制可读可写,并将读到的数据输出出来,附完整代码
时间: 2024-09-13 18:10:29 浏览: 45
一个很简单的Ubuntu下读写串口的C++程序
4星 · 用户满意度95%
要在Ubuntu系统上编写一个C++编写的串口工具,使其能够进行16进制的读写操作,并输出读到的数据,你可以使用Linux下的串口编程接口,通常是termios结构体来进行串口配置和读写操作。以下是一个简单的示例代码,用于打开串口,配置串口参数,以及读写数据。
请注意,这个示例仅供参考,实际应用中可能需要根据具体的串口硬件和需求进行调整。还需要确保你有合适的权限来访问串口设备文件,通常需要root权限。
```cpp
#include <iostream>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <cstdlib>
#include <cstring>
int main() {
// 串口设备文件
std::string portName = "/dev/ttyS0";
// 打开串口
int serialPort = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
if (serialPort == -1) {
std::cerr << "Can't open " << portName << std::endl;
return EXIT_FAILURE;
}
// 配置串口参数
struct termios tty;
memset(&tty, 0, sizeof tty);
if (tcgetattr(serialPort, &tty) != 0) {
std::cerr << "Can't get serial port attributes" << std::endl;
close(serialPort);
return EXIT_FAILURE;
}
cfsetispeed(&tty, B9600); // 输入波特率
cfsetospeed(&tty, B9600); // 输出波特率
tty.c_cflag &= ~PARENB; // 清除校验位
tty.c_cflag &= ~CSTOPB; // 清除停止位
tty.c_cflag &= ~CSIZE; // 清除当前字符大小掩码
tty.c_cflag |= CS8; // 8位字符大小
tty.c_cflag &= ~CRTSCTS; // 禁用RTS/CTS流控制
tty.c_cflag |= CREAD | CLOCAL; // 打开接收器,忽略调制解调器控制线
tty.c_lflag &= ~ICANON; // 关闭规范模式
tty.c_lflag &= ~ECHO; // 关闭回显
tty.c_lflag &= ~ECHOE; // 关闭回显擦除
tty.c_lflag &= ~ECHONL; // 关闭换行回显
tty.c_lflag &= ~ISIG; // 关闭信号
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // 关闭软件流控制
tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); // 禁用特殊处理
tty.c_oflag &= ~OPOST; // 关闭实现定义的输出处理
tty.c_oflag &= ~ONLCR; // 关闭换行转回车换行
// 设置读取超时
tty.c_cc[VTIME] = 10; // 读取超时为0.1秒
tty.c_cc[VMIN] = 0;
// 应用配置
if (tcsetattr(serialPort, TCSANOW, &tty) != 0) {
std::cerr << "Can't set serial port attributes" << std::endl;
close(serialPort);
return EXIT_FAILURE;
}
// 写入数据到串口
char *writeBuffer = "Hello, Serial Port!";
int n = write(serialPort, writeBuffer, strlen(writeBuffer));
if (n < 0) {
std::cerr << "Error writing to serial port" << std::endl;
close(serialPort);
return EXIT_FAILURE;
}
std::cout << "Wrote " << n << " bytes to serial port" << std::endl;
// 从串口读取数据
char readBuffer[256];
n = read(serialPort, readBuffer, sizeof(readBuffer));
if (n < 0) {
std::cerr << "Error reading from serial port" << std::endl;
close(serialPort);
return EXIT_FAILURE;
}
std::cout << "Read " << n << " bytes from serial port" << std::endl;
std::cout << "Data: ";
for (int i = 0; i < n; i++) {
printf("%02X ", readBuffer[i] & 0xFF);
}
std::cout << std::endl;
// 关闭串口
close(serialPort);
return EXIT_SUCCESS;
}
```
在编译上述代码之前,确保已经安装了g++编译器。可以使用以下命令编译:
```bash
g++ -o serialTool serialTool.cpp -lstdc++fs
```
然后以root权限运行生成的可执行文件:
```bash
sudo ./serialTool
```
在使用上述代码时,需要根据实际情况修改串口设备文件名(`/dev/ttyS0`),波特率(B9600),以及其他串口配置参数。还需要确保写入的数据和从串口读取数据的处理逻辑与实际应用场景相匹配。
阅读全文