串口通讯程序的编写需要根据具体的硬件(如 PLC、单片机、PC)和通讯协议(如 MODBUS、自定义 ASCII)来实现。以下以PC(Python)与设备和PLC(三菱 FX 系列) 为例,介绍串口通讯程序的编写方法。
一、PC 端串口通讯(Python 示例)
使用 Python 的pyserial库实现串口数据的发送与接收,适用于与传感器、PLC 等设备的通讯。
1. 安装库
bash
pip install pyserial
2. 基础通讯程序
python
运行
import serialimport time# 初始化串口def init_serial(port='COM3', baudrate=9600, timeout=1):
try:
ser = serial.Serial(
port=port, # 端口(Windows为COMx,Linux为/dev/ttyUSBx)
baudrate=baudrate, # 波特率
parity=serial.PARITY_NONE, # 校验位:无
stopbits=serial.STOPBITS_1, # 停止位:1位
bytesize=serial.EIGHTBITS, # 数据位:8位
timeout=timeout # 超时时间(秒)
)
if ser.is_open:
print(f"串口 {port} 已打开")
return ser else:
return None
except Exception as e:
print(f"串口初始化失败:{e}")
return None# 发送数据def send_data(ser, data):
if ser and ser.is_open:
try:
# 发送字节数据(需根据协议转换,如字符串转bytes)
ser.write(data.encode('utf-8')) # 发送字符串
# 或发送十六进制指令(如MODBUS帧)
# ser.write(b'\x01\x03\x00\x00\x00\x02\xC4\x0B')
print(f"发送数据:{data}")
return True
except Exception as e:
print(f"发送失败:{e}")
return False
return False# 接收数据def receive_data(ser, max_bytes=1024):
if ser and ser.is_open:
try:
data = ser.read(max_bytes) # 读取指定字节数
if data:
# 转换为字符串(或十六进制)
print(f"接收数据(十六进制):{data.hex()}")
print(f"接收数据(字符串):{data.decode('utf-8', errors='ignore')}")
return data return None
except Exception as e:
print(f"接收失败:{e}")
return None
return None# 主函数if __name__ == "__main__":
ser = init_serial(port='COM3', baudrate=9600)
if ser:
try:
while True:
# 发送指令
send_data(ser, "Hello, Device!")
# 接收响应
receive_data(ser)
time.sleep(1) # 间隔1秒
except KeyboardInterrupt:
print("用户终止程序")
finally:
ser.close()
print("串口已关闭")3. 关键参数说明
二、PLC 串口通讯(三菱 FX 系列示例)
三菱 FX 系列 PLC(如 FX3U)通过 RS485 模块(如 FX3U-485-BD)实现串口通讯,使用FROM/TO指令或专用协议。
1. 硬件配置
2. 梯形图程序(发送数据)
ladderlogic
// 初始化串口参数(波特率9600,无校验) LD M8002 // 启动脉冲 MOV K9600 D8120 // 波特率=9600 MOV K0 D8121 // 数据格式:8位,1停止位,无校验(K0) // 发送数据(如发送字符串"TEST") LD X0 // 发送触发按钮 PULSE M0 1 // 上升沿触发 LD M0 MOV H54 D200 // 'T'的ASCII码 MOV H45 D201 // 'E'的ASCII码 MOV H53 D202 // 'S'的ASCII码 MOV H54 D203 // 'T'的ASCII码 MOV K4 D204 // 发送字节数=4 // 调用发送指令(D8120为串口控制寄存器) FROM K0 K10 D205 K1 // 检查发送缓冲区是否空闲 LD M0 AND D205 // 缓冲区空闲 TO K0 K10 D200 K5 // 发送数据(D200开始,5个寄存器)
3. 梯形图程序(接收数据)
ladderlogic
// 接收数据并存储到D300开始的寄存器 LD M8000 // 运行中 FROM K0 K20 D300 K1 // 读取接收缓冲区状态 LD D300 // 有数据接收 FROM K0 K21 D301 K4 // 读取4字节数据到D301~D304 TO K0 K20 K0 K1 // 清除接收标志
三、通用编程步骤
四、常见问题解决
通过以上方法,可实现不同设备间的串口通讯,核心是严格遵循协议格式,确保数据收发的准确性。

