【问题标题】:Check what serial port i'm using in linux检查我在linux中使用的串口
【发布时间】:2012-10-02 00:50:03
【问题描述】:

我有一个插入的 USB 串行设备插入我的 Windows 并使用 virtualbox 对其进行串行映射,例如 COM1 -> /dev/ttyS0..

现在我如何知道我的设备正在使用哪个串行端口。我现在知道我正在使用 /dev/ttyS0。但是如果我不知道怎么办?.. Linux Debian 在启动时创建这个永久串行端口设备 /​​dev/ttyS0-S3。

如何测试 /dev/ttyS0 是我在 c 中使用的真实端口。

这是我测试端口是否正确的方法。

devfd=open("/dev/ttyS0",O_WRONLY | O_NOCTTY | O_NDELAY);

        if(s_fd<0) exit(1);

        printf("open\n");    //It will always return true printing open because this device is created on boot time and is always available. so i made another check and that is to write to the port(Assuming i have set the permission to have full access to the serial port). if i can write to the port then it means it is really the port im using.

test=write(devfd,"ATZ",4);

if(test<0) printf("Can't write to port: Maybe not the serial port ur using\n");

printf("Device is avaialable\n");  // returns true because we can write to the port

如果有设备插入该串行端口,您能否向我展示如何检查串行端口的其他示例?

或者在 c 中测试以下串行端口 /dev/ttyS0 - /dev/ttyS3 如果以下已插入设备。

谢谢。

【问题讨论】:

  • 如果只有这个串行端口正在主动发送(或接收)而所有其他端口都处于静止状态,那么该活动应该显示在 @987654322 中每个串行端口的“tx:”传输字节计数中@文件。

标签: c linux linux-kernel serial-port


【解决方案1】:

Standard Serial ports 映射为 /ttyS0,/ttyS1,... 正如您正确说明的那样。 通用USB Serial Ports 以及大多数G3 modems 都可以通过/dev/ttyUSB0 访问/dev/ttyUSB255

区分串行端口是否与调制解调器“连接”的更好方法是将ATIx 命令发送到串行端口。这些是Identity 命令,您可以使用它们来检测设备的型号名称和许多其他详细信息。

首先您尝试发送ATIx 命令而不更改波特率。如果您没有收到任何有效响应(ASCII 多行文本后跟OK&lt;CR&gt;&lt;LF&gt; ERROR...&lt;CR&gt;&lt;LF&gt; 则您可以更改波特率并重试。最好先设置端口支持的最大速度,然后再降低它直到你找到调制解调器或者你最终得到 110 波特或其他合理的限制。

有一种方法可以检测是否很可能没有任何东西连接到串行端口。背后的想法是检测在一段合理的时间内持续存在的帧错误(以选定的波特率接收字节的数十次),比如 2-3 秒。要了解如何启用/禁用帧错误检测,请查看 man termios。但是,我不确定在您描述的设置中这是否可行(在 VM 中),因此您必须尝试。

也可以看看这个帖子How to connect to a terminal to Serial-USB device on Ubuntu 10.10?

【讨论】:

  • 谢谢你的 Serge。但是如果我不使用调制解调器怎么办?例如,像连接到上述端口的嵌入式系统,我如何知道串行端口是否可用?再次感谢您的回答。
  • 术语 embedded 太宽。一般来说,如果您不知道设备应该如何响应,您只能通过分析CDDSRCTS 信号的状态来假设有东西被插入。当没有任何东西连接它们时,它们都处于相同的状态。但是,这确实不可靠。
  • 谢谢.. 我以前的做法好吗?.. 打开并写入端口?如果我能写,那就意味着有东西插到那个串口上?
  • 你以前的方法还可以,但我会推荐你​​ ATI1,ATI2,e.t.c.我刚回过神来,想起一件事。我会在几分钟内更新答案
  • @demic0de:你的问题的根源在于,最终串口硬件本身并不真正知道是否有任何东西插入它。
【解决方案2】:

请注意,根据经验,我发现写入串行端口进行测试可能会产生可怕的后果;因为我的脚本在尝试测试对断开连接的设备的写入时挂起(但仅在 ESXi 管理程序上运行时)

如果有帮助,这里有一个更安全的检查方法

cat /proc/tty/driver/serial | \
    grep -v unknown | \
    sed 's/^/ttyS/g'

然后例如检查 ttyS0 的输出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 2019-03-13
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多