Tcl 拒绝在 Linux 上为串行通道设置 76800 波特率
Tcl refuses to set 76800 baud rate for serial channel on Linux
我在 /dev/ttyUSB0 有一个 FTDI USB/serial 设备。我用
设置了我的频道
% set channel [open /dev/ttyUSB0 r+]
file3
% chan configure $channel -mode "76800,n,8,1" -buffering none -blocking 0 -translation auto
这对 Windows 上的 Tcl 来说工作得很好。在 Linux 上,波特率查询显示
% puts [chan configure $channel -mode]
57600,n,8,1
我得到了所有你期望以错误的波特率进行通信的垃圾。我看到了之前的 post:
...在 Tcl 源代码中引用一组固定的波特率。有没有办法让我添加我的非标准波特率以使通信在 Windows 和 Linux 下工作?
Tcl 拒绝将速度设置为这些值,因为底层 C 函数不支持 Linux 上的那些波特率。事实上,这里的问题不是 Tcl 甚至你的 libc,而是 Linux:它支持一组固定的波特率,而 76800 不是其中之一。
在我的系统 (Debian sid) 上,超出 POSIX 指定的波特率在 /usr/include/x86_64-linux-gnu/bits/termios-baud.h
中可见。此位置可能因 OS 和版本而异。
如果您想使用此串行设备,您需要将其配置为不同的速率。最接近的是 57600 和 115200。最大支持的 POSIX 指定版本是 38400。
虽然 bk2204 的响应在 标准 波特率方面是正确的,但可以将非标准波特率用于 FTDI 设备。至少在 Linux 的旧版本中,可以告诉驱动程序在芯片上设置自定义除数以正确的波特率输出(详见 this answer)。不过我已经好几年没有尝试过这个了,所以这可能不再有效了。
在 Windows,您需要为您想要自定义波特率的芯片编辑注册表(参见 FTDI 文档 AN_120)。
这两者都基于您使用的是 FTDI 芯片这一事实 - 其他 USB 到串行转换器可能无法在自定义波特率下工作。
我在 /dev/ttyUSB0 有一个 FTDI USB/serial 设备。我用
设置了我的频道% set channel [open /dev/ttyUSB0 r+]
file3
% chan configure $channel -mode "76800,n,8,1" -buffering none -blocking 0 -translation auto
这对 Windows 上的 Tcl 来说工作得很好。在 Linux 上,波特率查询显示
% puts [chan configure $channel -mode]
57600,n,8,1
我得到了所有你期望以错误的波特率进行通信的垃圾。我看到了之前的 post:
Tcl 拒绝将速度设置为这些值,因为底层 C 函数不支持 Linux 上的那些波特率。事实上,这里的问题不是 Tcl 甚至你的 libc,而是 Linux:它支持一组固定的波特率,而 76800 不是其中之一。
在我的系统 (Debian sid) 上,超出 POSIX 指定的波特率在 /usr/include/x86_64-linux-gnu/bits/termios-baud.h
中可见。此位置可能因 OS 和版本而异。
如果您想使用此串行设备,您需要将其配置为不同的速率。最接近的是 57600 和 115200。最大支持的 POSIX 指定版本是 38400。
虽然 bk2204 的响应在 标准 波特率方面是正确的,但可以将非标准波特率用于 FTDI 设备。至少在 Linux 的旧版本中,可以告诉驱动程序在芯片上设置自定义除数以正确的波特率输出(详见 this answer)。不过我已经好几年没有尝试过这个了,所以这可能不再有效了。
在 Windows,您需要为您想要自定义波特率的芯片编辑注册表(参见 FTDI 文档 AN_120)。
这两者都基于您使用的是 FTDI 芯片这一事实 - 其他 USB 到串行转换器可能无法在自定义波特率下工作。