# vserial **Repository Path**: wxk0076/vserial ## Basic Information - **Project Name**: vserial - **Description**: linux 的虚拟串口驱动,用于必须访问串口的设备,比如短信猫。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-08 - **Last Updated**: 2025-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 内核级虚拟串口驱动 (STJ) 这是一个内核级虚拟串口驱动,可以创建虚拟串口设备并通过TCP转发数据,避免用户态轮询带来的高CPU占用问题。 ## 特性 - 内核级实现,更接近硬件串口行为 - 自动TCP连接和重连 - 环形缓冲区,支持大数据量 - 阻塞式读取,减少CPU占用 - 支持poll/epoll事件通知 ## 编译 ```bash # 编译内核模块 make # 清理编译文件 make clean ``` ## 安装和使用 ### 1. 开发环境(推荐) 配置文件放在当前目录: ```bash # 虚拟串口配置文件 # 格式:设备名,IP地址,端口,描述 ttyV0,127.0.0.1,5000,串口1 ttyV1,127.0.0.1,5001,串口2 ttyV2,192.168.1.100,5002,远程串口 ttyV3,127.0.0.1,5003,串口4 ``` 自动加载模块: ```bash # 从配置文件加载 ./load_from_config.sh # 生成测试脚本 ./generate_test.sh ./test_config.sh ``` ### 2. 生产环境安装 系统级安装: ```bash # 安装到系统目录 sudo ./install.sh # 编辑系统配置文件 sudo vim /etc/vserial/vserial.conf # 方式1:手动加载 sudo vserial_load sudo vserial_unload # 方式2:系统服务(推荐) sudo systemctl enable vserial-stj sudo systemctl start vserial-stj sudo systemctl status vserial-stj ``` **为什么不能使用 /etc/modules?** 由于需要从配置文件读取参数,模块不能直接放在 `/etc/modules` 中自动加载。推荐使用 systemd 服务方式。 ### 3. 配置文件优先级 配置工具会按以下顺序查找配置文件: 1. `./vserial.conf` - 当前目录 2. `$HOME/.vserial/vserial.conf` - 用户目录 3. `/etc/vserial/vserial.conf` - 系统配置 4. `/usr/local/etc/vserial/vserial.conf` - 本地系统配置 ### 4. 检查系统串口 现代Linux系统通常会预创建 `/dev/ttyS0` 到 `/dev/ttyS31` 的设备文件,但只有实际存在的硬件串口才能正常工作。 **查看真正可用的串口:** ```bash # 快速检测所有串口 ./quick_check.sh # 详细检测 ./check_serial.sh # 手动检测 dmesg | grep -i -E "(ttyS|ttyUSB|ttyAMA|ttyACM|serial|uart)" find /dev -name "tty*" -type c | grep -E "(S|USB|AMA|ACM|XR|MX)" # 测试串口是否可用 stty -F /dev/ttyS0 2>/dev/null && echo "ttyS0 可用" || echo "ttyS0 不可用" stty -F /dev/ttyUSB0 2>/dev/null && echo "ttyUSB0 可用" || echo "ttyUSB0 不可用" ``` **避免冲突的命名策略:** - 使用 `ttyV*` 前缀(推荐) - 使用高位编号如 `ttyS32`, `ttyS33` - 使用描述性名称如 `virtual_serial1` ### 2. 手动加载模块 ```bash # 加载单个设备(默认连接到127.0.0.1:5000) sudo insmod vserial_simple.ko # 指定TCP服务器IP和端口 sudo insmod vserial_simple.ko tcp_ip=192.168.1.100 tcp_server_port=5000 # 加载多个设备 sudo insmod vserial_simple.ko num_devices=4 \ dev0_ip=127.0.0.1 dev0_port=5000 \ dev1_ip=127.0.0.1 dev1_port=5001 \ dev2_ip=192.168.1.100 dev2_port=5002 \ dev3_ip=127.0.0.1 dev3_port=5003 ``` ### 2. 查看设备 ```bash # 查看创建的设备 ls -l /dev/ttyV0 # 查看模块信息 dmesg | grep vserial ``` ### 3. 设置权限 ```bash # 设置设备权限 sudo chmod 666 /dev/ttyV0 # 或者添加到dialout组 sudo usermod -a -G dialout $USER ``` ### 4. 测试设备 ```bash # 测试写入 echo "test" > /dev/ttyV0 # 测试读取 cat /dev/ttyV0 ``` ### 5. 查看状态 ```bash # 查看当前状态 make status # 或使用脚本 ./vserial_status.sh # 实时监控 make monitor # 或 ./vserial_monitor.sh # 直接查看proc文件 cat /proc/vserial_stj/status ``` ### 6. 卸载模块 ```bash sudo rmmod vserial_stj ``` ## 参数说明 - `tcp_ip`: TCP服务器IP地址(默认:127.0.0.1) - `tcp_server_port`: TCP服务器端口(默认:5000) - `reconnect_interval`: 重连间隔(秒,范围:1-30,默认:10,超出范围自动调整) ## 与用户态方案对比 | 特性 | 用户态(socat) | 内核态(vserial) | |------|---------------|-----------------| | CPU占用 | 高(轮询) | 低(事件驱动) | | 延迟 | 高 | 低 | | 稳定性 | 一般 | 高 | | 调试难度 | 简单 | 复杂 | | 功能扩展 | 容易 | 困难 | ## 故障排除 ### 1. 编译错误 确保已安装内核头文件: ```bash sudo apt-get install linux-headers-$(uname -r) ``` ### 2. 加载失败 检查内核日志: ```bash dmesg | tail -20 ``` ### 3. TCP连接失败 检查网络连接和防火墙设置: ```bash # 测试TCP连接 telnet 192.168.1.100 5000 ``` ### 4. 权限问题 确保用户有访问设备的权限: ```bash sudo chmod 666 /dev/ttyV0 ``` ## 性能优化 1. **调整缓冲区大小**:修改`BUFFER_SIZE`宏定义 2. **优化TCP参数**:调整重连间隔和超时时间 3. **使用多线程**:为每个虚拟串口创建独立线程 ## 注意事项 1. 需要root权限加载内核模块 2. 模块卸载前确保没有程序在使用设备 3. 网络断开时会自动重连 4. 建议在生产环境使用前充分测试 ## 许可证 GPL v2