我在 Fedora 16 和我的串口上遇到了一个令人头疼的问题。
我使用串口来监控我正在开发的机顶盒。 STB 在 Linux 上运行,启动时,我通过串行接口启动我正在处理的程序。
现在,我的程序在调试时输出大量跟踪,并且buffer overrun
在dmesg
.
这使得应用程序的调试变得一团糟,因为串行输出变得不可读。
所以,困扰我的是,当我在 Fedora 15 上运行时,没有出现缓冲区溢出根本不!
有关我的设置的更多详细信息:
- Fedora Core 16 在 Cinnamon/gnome-terminal 下用于串行。名称:
3.2.6-3.fc16.x86_64
- 要连接串行端口,我使用以下命令:
screen -R -d -t "Serial" /dev/ttyS0 115200
知道我该如何解决这个问题吗?
(更多细节:)
$ cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:3395 rx:11899157 fe:6 brk:4 oe:3496 RTS|DTR
### ^^^^^^^
### overflow errors
1: uart:16550A port:0000EC98 irq:17 tx:32 rx:0 CTS|DSR|CD
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
典型的 dmegs 输出:
[370425.080452] ttyS0: 24 input overrun(s)
[370426.092382] ttyS0: 30 input overrun(s)
[370427.109291] ttyS0: 36 input overrun(s)
[370428.173344] ttyS0: 28 input overrun(s)
[370429.583198] ttyS0: 26 input overrun(s)
[370430.638700] ttyS0: 32 input overrun(s)
:( :( :(
输出sudo setserial -v -a -g /dev/ttyS0
:
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test low_latency
答案1
根据 Fedora 16 文档/etc/rc.serial负责设置串行线。
您的 15 版和 16 版安装之间有什么变化吗?
设置“低延迟”和“rx/tx_trigger”(如果可能)可能会有所帮助。
我记得 16550A 有一个 15 字节输入缓冲区。您可以以某种方式设置生成中断的填充级别 - 我使用 7 个字节来在可靠性和速度之间进行权衡(使用 DOS)。也许 rx/tx-trigger 会进行类似的调整。
2012年3月12日更新:
我刚刚检查了我的工作站(CentOS5 - 应该与 Fedora 相当):
rpm -qd setserial
显示可用的文档。有一个自述文件和一个示例rc.serial文件 - 请参阅自述文件。
除此之外 - 我再次查看了你的输出:速度正常我看起来不太好。你想要 115 kb - 所以你应该设置spd_vhi(参见 man setserial)。原因是您请求的大小不能超过 38.4 kb,因为 UART 标准不允许更多。后来是 57.6kb,然后是 115kb——也必须有一个“技巧”来设置这些速度。
答案2
我遇到了类似的问题。我能够将其与另一个竞争中断服务时间的设备隔离。就我而言,我的笔记本电脑的 SD 卡读卡器正在与我的串行设备争夺时间。我禁用了读卡器驱动程序(rmmod),超限现象消失了。您可以使用以下命令查看同一 IRQ 上的设备:cat /proc/interrupts