【问题标题】:PNP(Plug and Play) event handling in Serial Port Programming串口编程中的 PNP(即插即用)事件处理
【发布时间】:2014-05-06 07:07:38
【问题描述】:

我正在编写一个应用程序,例如用于 RS232 端口连接设备的串行端口驱动程序。我在处理即插即用事件时遇到问题(如何通知连接和断开设备与 PC 的已安装 RS232 端口?)。我正在为每个设备打开一个文件描述符 (/dev/ttySx),我需要在将设备连接到 PC 时打开它,并在断开连接时将其关闭。我的问题是我是否需要像在 USB 设备(在 libusb 库中)一样处理串行端口编程中的 PNP 事件,如果是,那么最好的方法是什么?

操作系统:CentOS

编程语言:C++

【问题讨论】:

    标签: c++ linux serial-port


    【解决方案1】:

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

    不幸的是,在最基本的行为(RX、TX 和接地的三根线)中,没有明确的方法可以确定串行端口上是否连接了某些东西。如果您使用至少四根线,您可以使用 DCD(Data Carrier Detect)来注意到一个串行端口“连接在另一端”。在 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”命令询问另一台机器是否还在。如果没有回复,那么设备已经消失了......

    【讨论】:

    • 非常感谢您向我描述这些事情。另一端连接到条形码扫描仪,当前应用程序可以进行数据读取和写入。我的下一个计划是使用多个设备然后可以通过使用设备文件(“/dev/ttyS0、/dev/ttyS1 等”)打开多个文件描述符来处理多个设备的连接来打开多个连接。
    • 是的,应该可以。假设您的机器当然有多个串行设备...... ;)
    猜你喜欢
    • 2013-07-21
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多