串口通讯程序的编写需要根据具体的硬件(如 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 // 清除接收标志
三、通用编程步骤
四、常见问题解决
通过以上方法,可实现不同设备间的串口通讯,核心是严格遵循协议格式,确保数据收发的准确性。