关于服务器通过串口进行通信

声明:本博文用于学习总结及工作心得


环境:Ubuntu系统 14.04 两台

MASTER 192.168.1.154  

BACKUP 192.168.1.142


最近搭建服务器集群, 需要用到串口作为心跳,用来检测服务器健康;其中遇到的问题,在这里总结一下

硬件详情:

PC机一般有1个或者2个异步串行通信接口,组装在主板上,称为COM1和COM2

PC机上的COM、COM2连接器符合RS-232接口

当前主板属于定制的主板,所以跟传统的九孔的串行口不一样,这里是在主板上已经转为RJ45接口,两台服务器一样;

这样的话,可以将网线改造一下直接进行两台服务器的串口通信;


1.首先,需要在服务器上查询可以使用的串口,linux上设备文件在/dev目录下,普通串口一般是ttyS* ,如果是USB转串口设备的话是ttyUSB*;

可使用dmesg命令查看,直接接串口的话使用dmesg |grep ttyS*, USB转串口使用dmesg | grep ttyUSB*;

[    0.000000] console [tty0] enabled
[    0.814605] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[    0.836088] 00:06: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
[    3.535071] tty tty45: hash matches

可以看到串口1-ttyS0, 串口2-ttyS1


2.查看串口波特率

stty-F /dev/ttyS0-a

speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt

3.设置串口参数

stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8


4.制作串口线: 全反线

一般网线接法为568A 568B,连接方法称为直连法和交叉连法

568A的排线顺序从左到右依次为:白绿、绿、白橙、蓝、白蓝、橙、白棕、棕。
568B
则为:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。 
尝试过直连和交叉行不通,最后是看见console线序接法,做全反线才能成功连接两台服务器的串口

材料:网线一根长度1M以内(串口是短距离通信),水晶头2

线序1: 568B线序 1白橙 2 3白绿 4 5白蓝 6绿 7白棕 8

线序2: 568B反线序 1 2白棕 3绿 4白蓝 5 6白绿 7 8白橙



5.设置好波特率等参数,以及将接好的线连接上一以后就可以进行测试

BACKUP: cat /dev/ttyS0

MASTER: echo '1' > /dev/ttyS0

BACKUP主机打印:

root@MASTER:~# cat /dev/ttyS0
1

到这里,串口通信已经完成,这里多说一点串口线 的 自制 和 线序 定义


几类Console线的线序 配置电缆 串口电缆线序

华为Console 
(等效标准Terminal + 全反线)
COM(9P母头) & RJ45(水晶头)  1 - ?  2 - 3  3 - 6  4 - 7  5 - 5  6 - 2  7 - 8  8 - 1  9 - ? 

标准的Terminal 
COM(9P母头) & RJ45 
1 - 5  2 - 6  3 - 3  4 - 2  5 - 4  6 - 7  7 - 1  8 - 8  9 - ?
标准的Terminal
COM(9P母头) & RJ45  1 - 5  2 - 6  3 - 3  4 - 2  5 - 4  6 - 7  7 - 1  8 - 8  9 - ?

标准的Terminal 
COM(9P母头) & RJ45 
1 - 5  2 - 6  3 - 3  4 - 2  5 - 4  6 - 7  7 - 1  8 - 8  9 - ?
Modem 
COM(25P公头) & RJ45 
1 - ?  2 - 6  3 - 3  5 - 1  7 - 4 & 5  8 - 2  20 - 7

Modem 
COM(25P公头) & RJ45 
1 - ?  2 - 6  3 - 3  5 - 1  7 - 4 & 5  8 - 2  20 - 7

EQ0246 (Cajun P330) 
COM(9P母头) & RJ45 
1 - 3  2 - 7  3 - 8  4 - 6  5 - 5  6 - ?  7 - 1  8 - 2  9 - ?

全反线 RJ45 & RJ45 
1 - 8  2 - 7  3 - 6  4 - 5  5 - 4  6 - 3  7 - 2  8 - 1


主机对联接线方式: 
标准Console(Terminal) - 全反线 - 标准Console(Terminal)

主机连接交换机&路由器(RJ45) 
标准Console(Terminal) - 全反线 
标准Console 自带全反线





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Python代码示例,可以实现UDP程序和串口服务器通信: ```python import socket import serial # 串口服务器配置 SERIAL_PORT = 'COM1' SERIAL_BAUDRATE = 9600 # UDP服务器配置 UDP_IP = '127.0.0.1' UDP_PORT = 5005 ser = serial.Serial(SERIAL_PORT, SERIAL_BAUDRATE) # 创建UDP socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定IP和端口号 sock.bind((UDP_IP, UDP_PORT)) while True: # 读取串口数据 data = ser.readline().decode().strip() # 发送数据到UDP服务器 sock.sendto(data.encode(), (UDP_IP, UDP_PORT)) # 接收UDP服务器的响应数据 resp, addr = sock.recvfrom(1024) # 打印响应数据 print(resp.decode()) ser.close() sock.close() ``` 上述代码中,我们使用了Python内置的socket库和serial库来实现UDP程序和串口服务器通信。首先,我们通过serial.Serial()函数创建一个串口对象,并指定串口服务器的配置参数。然后,我们使用socket.socket()函数创建一个UDP socket对象,并通过sock.bind()方法绑定UDP服务器的IP地址和端口号。 在while循环中,我们使用串口对象的readline()方法读取串口数据,并将数据发送到UDP服务器,使用sock.recvfrom()方法接收UDP服务器的响应数据,并打印出来。最后,我们通过ser.close()和sock.close()方法关闭串口对象和UDP socket对象。 需要注意的是,上述代码只是一个简单的示例,实际应用中需要根据具体的需求进行修改和完善。同时,需要保证串口服务器和UDP服务器之间的通信协议和数据格式一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值