c++ - 串口编程中的PNP(Plug and Play)事件处理

标签 c++ linux serial-port

我正在编写一个应用程序,例如用于 RS232 端口连接设备的串行端口驱动程序。我在处理即插即用事件时遇到问题(How to notify connect and disconnect devices to installed RS232 ports of PC?)。我正在为每个设备打开一个文件描述符 (/dev/ttySx),我需要在将设备连接到 PC 时打开它,在断开连接时需要关闭它。我的问题是我是否需要像在 USB 设备(在 libusb 库中)一样在串行端口编程中处理 PNP 事件,如果需要,最好的方法是什么?

操作系统:CentOS

编程语言:C++

最佳答案

因此,传统串行端口没有直接的 PNP 事件 - 显然 USB 串行端口在某种程度上是串行端口,但我相信这是由串行设备的“usb 驱动程序”处理的,而不是其他东西你需要处理。

不幸的是,没有明确的方法可以确定串行端口上连接的最基本行为(RX、TX 和接地的三根线)。如果您至少使用四根线,则可以使用 DCD(数据载波检测)来注意到串行端口“连接在另一端”。在 linux 中,没有办法在用户模式下识别 DCD 引脚本身的变化。如果您尝试使用 fd = open("/dev/ttyS0", O_RDWR); - 如果您指定 O_NONBLOCK 它将立即打开,无论 DCD 的状态如何。如果您未指定 O_NONBLOCK,则操作系统会在打开之前等待运营商出现。如果需要,可以稍后将文件更改为非阻塞。然后,您将不得不使用 IOCTL 调用(或这些调用的其他一些包装)来轮询 DCD:http://man7.org/linux/man-pages/man4/tty_ioctl.4.html

“检测”串行端口的另一种方法是简单地从端口发送一些内容,然后查看是否收到(正确类型的)答复。这显然假设该设备实际上被设计为以某种方式响应串行端口上的某些事件 - 例如,调制解调器将接受“Hayes 命令”或“AT 命令”,并将一些信息返回给这些命令。但是,当然,要使其正常工作,您需要先打开设备,然后发送内容,并且(如果是调制解调器)很难检测到设备何时消失。当然,如果你的另一端有“你自己的”设备,你可以在没有“流量”的情况下,发送一个“ping”命令来询问对方机器是否还在。如果没有回复,那么设备就没了……

关于c++ - 串口编程中的PNP(Plug and Play)事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488070/

相关文章:

c++ - 如何像下面的例子一样使用 byte

c++ - 如何设置适当的回调来检索数据

linux - Qt Hello World 教程不起作用

Linux:多重 SIGIO 问题(异步串行通信)

c++ - 串行端口 - 以 uint8 发送数据

c++ - 基准测试、代码重新排序、 volatile

c++ - 如何在 C++ 中为不同的迭代器 value_types 重载函数

C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

c++ - 如何在 C++ 中将文本文件读入二维动态 vector ?

linux - Linux 上的套接字接收超时