1

我有一个插入的 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 中如何检查串行端口的其他示例?

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

谢谢。

4

2 回答 2

0

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

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

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

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

另请查看这篇文章如何在 Ubuntu 10.10 上将终端连接到串行 USB 设备?

于 2012-10-02T01:21:02.717 回答
0

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

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

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

然后例如检查 ttyS0 的输出

于 2015-11-18T16:27:15.193 回答