在 expect
脚本中,我试图用直接访问 Ubuntu 14.04 下的串行端口/控制台来替换 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 行)。我们将努力在下一个版本中获得一组更新的速度。
--“催眠蟾蜍”肖恩·伍兹
更新:补丁 checkin :http://core.tcl.tk/tcl/info/7c1aae5292b3e6cd
关于linux - fconfigure 拒绝将波特率设置为 921600,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758436/