在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()
调用并设置正确的波特率。)
有什么想法吗?
答案 0 :(得分:4)
我已经研究过这个问题,它似乎是一个被限制在Tcl核心中的问题。在Unix平台上,我们有一个硬编码的波特率列表,最高的是460800。
如果您愿意攻击Tcl核心源,可以将自己的波特率添加到unix / tclUnixChan.c(第900行附近)中填充的velocity []数组中。我们将努力在下一版本中获得更新的速度。
- Sean“The Hypnotoad”Woods