在Linux下,常使用串口进行核心调试信息的输出接口。另外,在部署HA软件的时候,也可作为备份心跳之一。在大部分情况下,硬件(服务器)的串口应该是打开的,而且操作系统也应该可以自动识别。但之前在某项目中,一台IBM x3650的服务器就出现了一些问题,特描述一下。
一、必要条件
要在Linux下进行通讯,需要最少两个必要条件:
引用
1、主板需要打开串口
以IBM x3650为例,开机的时候,使用F1进入Bios配置,按F9选择默认值即可。也就是说,默认应该是打开的。可以进入PnP里面看看。
2、操作系统支持
以红旗 DC 5.0为例,其默认会对串口进行自动配置。但如果自动配置失败,则可能需要进行人工配置了。
以IBM x3650为例,开机的时候,使用F1进入Bios配置,按F9选择默认值即可。也就是说,默认应该是打开的。可以进入PnP里面看看。
2、操作系统支持
以红旗 DC 5.0为例,其默认会对串口进行自动配置。但如果自动配置失败,则可能需要进行人工配置了。
二、激活串口
前面已经提到,红旗上默认打开串口。例如在IBM x3850上,就看到下面的信息:
引用
# setserial /dev/ttyS0
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 500, divisor: 0
closing_wait: 30000
Flags: spd_normal skip_test auto_irq
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 500, divisor: 0
closing_wait: 30000
Flags: spd_normal skip_test auto_irq
但如果出现类似这次,在IBM x3650上看到的:
引用
# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: unknown, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 5000, divisor: 0
closing_wait: 37856
Flags: spd_normal skip_test auto_irq
/dev/ttyS0, Line 0, UART: unknown, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 5000, divisor: 0
closing_wait: 37856
Flags: spd_normal skip_test auto_irq
则表明串口并没有激活。
要解决该问题,第一步就是确认硬件是否打开端口。若已经打开,则可以用手动的方式修正一下:
# setserial /dev/ttyS0 uart 16550A
再看看:
引用
# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50000, divisor: 0
closing_wait: 50880
Flags: spd_normal skip_test auto_irq
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50000, divisor: 0
closing_wait: 50880
Flags: spd_normal skip_test auto_irq
三、测试串口
手动配置的串口不一定能用。可执行下面的测试。
1、在IBM x3850上,作为接收端:
# cat /dev/ttyS0
2、在IBM x3650上,作为发送端:
# echo 'test1234' > /dev/ttyS0
3、查看接收端是否能收到信息,即可判断串口通讯是否成功。
引用
# cat /dev/ttyS0
test1234
test1234
※测试的时候,请保证两端的速率一致,例如都为115200。
四、自动激活
为了让上述不能自动配置的串口在系统启动后,可以激活成功。我们可以借用一个serial服务。
通常情况下,该服务已经包含在setserial套件中,可以用下面的方式配置:
# cp /usr/share/doc/setserial-2.17/rc.serial /etc/rc.d/init.d/serial
# chkconfig –add serial
# chkconfig –add serial
最后,在/etc/rc.d/init.d/serial脚本的最后,加入:
引用
setserial /dev/ttyS0 uart 16550A
保存即可。
以后,系统启动时,即会自动完成串口的相关配置。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/112719.html