linux - fconfigure 拒绝将波特率设置为 921600

标签 linux serial-port tcl

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/

相关文章:

testing - 如何从一个文件位置获取数据并使用 tcl 代码运行

tcl - Tcl 中的变量范围

linux - 长时间运行的脚本的 Unix 重定向

c - Modbus 中的多线程?如何在 500 毫秒内发送查询并将响应时间保持为 1 秒?

c - Linux 进程调度程序

c# - C#中的串口通信参数不正确

c# - 提供异步串口通信

tcl - 使用别名时获取调用行号

c - 信号处理程序行为

linux - 无法从 CentOS 中的源构建 Mercurial