# Serial Port Example
## 简介
该项目包含一个串口类 `serial_port` 和一个使用示例,旨在帮助用户在 Linux 环境下高效地进行串口通信。项目包括串口类的实现、数据编解码类 `data_codec` 以及一个演示如何接收和处理串口数据的示例程序。
## 类说明
### `serial_port` 类
`serial_port` 类提供了以下功能:
- 打开串口 (`open_port`)
- 关闭串口 (`close_port`)
- 写入数据到串口 (`write_data`)
- 从串口读取数据 (`read_data`)
### `data_codec` 类
`data_codec` 类用于数据的编码和解码,主要用于处理从串口接收到的数据包。
## 使用方法
### 依赖
- CMake 3.10 或更高版本
- g++ 或 clang++ 编译器
### 编译和构建
在项目根目录中执行以下命令:
```bash
mkdir build
cd build
cmake ..
make
```
编译完成后,您将在`build/bin`目录下找到生成的可执行文件`serial_port_example`。
### 运行
```bash
./build/bin/serial_port_example <port_name> [baud_rate] [ctsrts]
```
例如:
```bash
./build/bin/serial_port_example /dev/ttyUSB0 115200 0
```
- `<port_name>`: 串口设备名称(例如`/dev/ttyUSB0`)
- `[baud_rate]`: 波特率(可选,默认为`115200`)
- `[ctsrts]`: 硬件流控制(可选,`0`表示禁用,`1`表示启用,默认为禁用)
## 示例说明
示例程序会打开指定的串口端口,使用 data_codec 类解码接收到的数据,并输出解码后的数据包序列号。
### 示例代码
```C
#include "serial_port.h"
#include "data_codec.h"
#include <iostream>
#include <thread>
#include <chrono>
void serial_receiver_example(const std::string &port_name, int baud_rate, bool ctsrts) {
try {
serial_port sp(port_name, baud_rate, ctsrts);
sp.open_port();
data_codec codec;
while (true) {
std::vector<uint8_t> data = sp.read_data(256);
std::vector<std::unique_ptr<pkt_t>> decoded_packets = codec.decode(data);
for (const auto &packet : decoded_packets) {
// 处理解码后的数据包
std::cout << "Received Packet with Sequence: " << packet->seq << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
sp.close_port();
} catch (const std::exception &e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
}
int main(int argc, char *argv[]) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " <port_name> [baud_rate] [ctsrts]" << std::endl;
return 1;
}
std::string port_name = argv[1];
int baud_rate = B115200;
bool ctsrts = false;
if (argc >= 3) {
int baud = std::stoi(argv[2]);
switch (baud) {
case 9600: baud_rate = B9600;
break;
case 19200: baud_rate = B19200;
break;
case 38400: baud_rate = B38400;
break;
case 57600: baud_rate = B57600;
break;
case 115200: baud_rate = B115200;
break;
case 1000000: baud_rate = B1000000;
break;
default: std::cerr << "Unsupported baud rate. Using default 115200." << std::endl;
break;
}
}
if (argc >= 4) {
ctsrts = std::stoi(argv[3]) != 0;
}
serial_receiver_example(port_name, baud_rate, ctsrts);
return 0;
}
```
## 许可证
该项目使用 MIT 许可证,详情请参见 LICENSE 文件。
## 作者
本项目由`Gavin`编写。如果您有任何问题或建议,请随时与我联系。