我有两个USB串口电缆在同一台PC上的2个不同的USB端口上相互连接 .

地线和A和B电缆都相互连接 . 电压电缆是隔离的 .

当我使用串行终端发送ASCII字符时,我可以双向通信 .

但是,当我为一个modbus奴隶和一个大师运行一个python脚本它有时会工作,有时它不会 . 我找不到一个模式,当它工作时,何时不工作 .

我可以看到它何时工作所有发送的字节都由从机接收,但是当它不工作时,从机接收至少1个字节而不是其余的 . 然后它显然会出现CRC错误并崩溃 . 为什么通过modbus而不是ASCII串行终端丢失了一些字节?

这是硬件问题吗?我该怎么知道?我没有连接额外的电阻器 .

我可以显示奴隶和主人的代码,谢谢

enter image description here
正如您所看到的,我有三条并联的USB转串口电缆,橙色和黄色电缆是A和B电缆,黑色电缆是接地电缆 .

这些电缆是http://www.ftdichip.com/Products/Cables/USBRS485.htm

这是奴隶代码,但我尝试了不同的库并得到了相同的结果,所以我怀疑它的代码:

#!/usr/bin/env python
# -*- coding: utf_8 -*-
"""
 Modbus TestKit: Implementation of Modbus protocol in python
 (C)2009 - Luc Jean - luc.jean@gmail.com
 (C)2009 - Apidev - http://www.apidev.fr
 This is distributed under GNU LGPL license, see license.txt
"""

import sys

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial

#PORT = 0
PORT = '/dev/ttyUSB2'

def main():
    """main"""
    logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")

    #Create the server
    server = modbus_rtu.RtuServer(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0))

    try:
        logger.info("running...")
        logger.info("enter 'quit' for closing the server")

        server.start()

        slave_1 = server.add_slave(1)
        slave_1.add_block('0', cst.HOLDING_REGISTERS, 0, 100)
        while True:
            cmd = sys.stdin.readline()
            args = cmd.split(' ')

            if cmd.find('quit') == 0:
                sys.stdout.write('bye-bye\r\n')
                break

            elif args[0] == 'add_slave':
                slave_id = int(args[1])
                server.add_slave(slave_id)
                sys.stdout.write('done: slave %d added\r\n' % (slave_id))

            elif args[0] == 'add_block':
                slave_id = int(args[1])
                name = args[2]
                block_type = int(args[3])
                starting_address = int(args[4])
                length = int(args[5])
                slave = server.get_slave(slave_id)
                slave.add_block(name, block_type, starting_address, length)
                sys.stdout.write('done: block %s added\r\n' % (name))

            elif args[0] == 'set_values':
                slave_id = int(args[1])
                name = args[2]
                address = int(args[3])
                values = []
                for val in args[4:]:
                    values.append(int(val))
                slave = server.get_slave(slave_id)
                slave.set_values(name, address, values)
                values = slave.get_values(name, address, len(values))
                sys.stdout.write('done: values written: %s\r\n' % (str(values)))

            elif args[0] == 'get_values':
                slave_id = int(args[1])
                name = args[2]
                address = int(args[3])
                length = int(args[4])
                slave = server.get_slave(slave_id)
                values = slave.get_values(name, address, length)
                sys.stdout.write('done: values read: %s\r\n' % (str(values)))

            else:
                sys.stdout.write("unknown command %s\r\n" % (args[0]))
    finally:
        server.stop()

if __name__ == "__main__":
    main()

编辑:我刚刚更改为波特率为115200,错误更少 . 还有什么我能做的吗?