我有两个USB串口电缆在同一台PC上的2个不同的USB端口上相互连接 .
地线和A和B电缆都相互连接 . 电压电缆是隔离的 .
当我使用串行终端发送ASCII字符时,我可以双向通信 .
但是,当我为一个modbus奴隶和一个大师运行一个python脚本它有时会工作,有时它不会 . 我找不到一个模式,当它工作时,何时不工作 .
我可以看到它何时工作所有发送的字节都由从机接收,但是当它不工作时,从机接收至少1个字节而不是其余的 . 然后它显然会出现CRC错误并崩溃 . 为什么通过modbus而不是ASCII串行终端丢失了一些字节?
这是硬件问题吗?我该怎么知道?我没有连接额外的电阻器 .
我可以显示奴隶和主人的代码,谢谢
正如您所看到的,我有三条并联的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,错误更少 . 还有什么我能做的吗?