问题记录
之前调试C串口通讯花了一些功夫,这里做一些总结并记录一些解决方案。
主要的坑有以下两点:
1. 周立功核心板A3352-W128Li 与 A3352-WB128Li存在硬件差异。A3352-WB128Li多了一个蓝牙,但是把串口1给占用了(串口1没有引出)。导致之前分配给某个模块的串口不能进行正常通信。
2. 使用串口0进行通信时,系统的调试数据会干扰串口0的正常使用。
关闭串口调试输出的方法
修改环境变量
之前我们是采用设置Uboot环境变量的方式,设置conosle=none
来配置串口不要进行输出。
周立功的核心板也可以通过类似的方法,但是每次修改需要进入Uboot才能进行修改。
修改内核配置
通过TOP
命令观察系统进程,找到了使用调试串口进行输出的程序 /sbin/getty
。
一开始我是打算干掉这个进程,但是发现该程序会不断被重启,可能存在守护进程。
直接重命名getty
这个程序,发现进程是没有再被启动了,但是控制台仍然会被占用,并且不停输出
can't run `/sbin/getty` no such file or direct
看来只能放弃该方法,需要从启动getty
的入口着手。
之后找到了配置文件/etc/inittab
# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels. The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id == tty to run on, or empty for /dev/console
# runlevels == ignored
# action == one of sysinit, respawn, askfirst, wait, and once
# process == program to run
# Startup the system
#null::sysinit:/bin/mount -t proc proc /proc
#null::sysinit:/bin/mount -o remount,rw /
null::sysinit:/bin/mkdir -p /dev/pts
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS
# Put a getty on the serial port
ttyO0::respawn:/sbin/getty -L ttyO0 115200 vt100 # GENERIC_SERIAL
# Logging junk
null::sysinit:/bin/touch /var/log/messages
null::respawn:/sbin/syslogd -n -m 0
null::respawn:/sbin/klogd -n
tty3::respawn:/usr/bin/tail -f /var/log/messages
# Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot
# Stuff to do before rebooting
null::shutdown:/usr/bin/killall klogd
null::shutdown:/usr/bin/killall syslogd
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a
注意这条配置,很明显就是我们需要修改的地方
# Put a getty on the serial port
ttyO0::respawn:/sbin/getty -L ttyO0 115200 vt100 # GENERIC_SERIAL
直接注释掉,重启设备。
成功屏蔽了调试串口ttyO0
的调试信息输出,串口模块也可以正常通信了。
Comments | NOTHING