返回主站|会员中心|保存桌面

希玛仪表综合服务商    

希玛红外测温仪,风速计,气体检测仪,兆欧表,测振仪,PH值检测仪,温湿度仪

新闻分类
  • 暂无分类
联系方式
  • 联系人:姚经理
  • 电话:18520143666
站内搜索
 
首页 > 新闻中心 > 串口通讯程序编写!
新闻中心
串口通讯程序编写!
发布时间:2025-10-01        浏览次数:14        返回列表

串口通讯程序的编写需要根据具体的硬件(如 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. 关键参数说明

  • 波特率:必须与设备一致(常用 9600、115200)。

  • 数据格式:数据位(8)、校验位(None/Even/Odd)、停止位(1)需匹配。

  • 数据转换:设备通常使用十六进制通讯,需用bytes类型发送(如b'\x01\x03')。

二、PLC 串口通讯(三菱 FX 系列示例)

三菱 FX 系列 PLC(如 FX3U)通过 RS485 模块(如 FX3U-485-BD)实现串口通讯,使用FROM/TO指令或专用协议。

1. 硬件配置

  • 模块:FX3U-485-BD(内置 RS485 接口)。

  • 协议:三菱专用协议(或 MODBUS RTU)。

  • 接线:A/B 线连接到设备的 RS485 接口。

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  // 清除接收标志

三、通用编程步骤

  1. 确定通讯协议

    • 明确波特率、数据格式(硬件协议)。

    • 确定数据帧格式(软件协议),如:[起始位][地址][数据][校验位][结束位]

  2. 数据帧处理

    • 发送:按协议组装数据(如添加校验位 CRC)。

    • 接收:解析数据帧,验证校验位,提取有效数据。

  3. 错误处理

    • 超时重发:接收超时后重新发送指令。

    • 校验失败:校验位错误时请求重发。

四、常见问题解决

  • 通讯不稳定:检查接线(A/B 是否反接)、增加终端电阻(120Ω)。

  • 数据错乱:确保波特率和数据格式完全匹配,减少干扰。

  • 校验错误:重新计算校验位(如 MODBUS 的 CRC 校验)。

通过以上方法,可实现不同设备间的串口通讯,核心是严格遵循协议格式,确保数据收发的准确性。

收缩
  • QQ咨询

  • 电话咨询

  • 18520143666
  • 添加微信客服