fconfigure 拒绝将波特率设置为 921600

fconfigure refuses to set baud rate to 921600

expect 脚本中,我试图用 Ubuntu 14.04 下的序列号 port/console 的直接访问替换 spawn kermit

代码相当简单:

set device "/dev/ttyUSB1"
set device_handle [open $device w+]
fconfigure $device_handle -mode "921600,n,8,1" -handshake none
#spawn -open $device_handle

我的问题是 Tcl (8.6) 或 Expect (5.45) 拒绝将波特率设置为 921600。

strace 输出中,我可以看到波特率设置为 460800(在 TCSETSW 命令中设置为 ioctl())。像这样:

$ grep TCSETSW strace.out.*
strace.out.28667:ioctl(6, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B460800 -opost -isig -icanon -echo ...}) = 0
strace.out.28667:ioctl(6, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B460800 -opost -isig -icanon -echo ...}) = 0
strace.out.28667:ioctl(6, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B460800 -opost -isig -icanon -echo ...}) = 0

我测试了较低的波特率 - 9600、115200、460800 - Tcl 以正确的波特率调用 ioctl()。只有当我尝试设置 921600 时,Tcl 才会设置 460800。 (kermit 使用相同的 ioctl() 调用并设置正确的波特率。)

有什么想法吗?

我已经研究了这个问题,它似乎是 Tcl 核心中的一个限制。在Unix平台上,我们有一个硬编码的波特率列表,最高的是460800。

如果您乐于破解 Tcl 核心源代码,您可以将自己的波特率添加到填充在 unix/tclUnixChan.c 中的 speeds[] 数组(大约第 900 行)。我们将努力在下一个版本中获得一组更新的速度。

--肖恩"The Hypnotoad"伍兹

更新:补丁签入:http://core.tcl.tk/tcl/info/7c1aae5292b3e6cd