pyserial / Modbus-解决“无法与仪器通讯”的问题

时间:2018-09-18 18:12:04

标签: python serial-port beagleboneblack beagleboard minimalmodbus

Beaglebone Black Wireless:Ubuntu 16.04,

计算机:Ubuntu 16.04,

Python 3.5.2

我正在尝试使用Beaglebone Black通过Modbus与设备进行通信。我听说有人使用minimalmodbus通过USB / RS485加密狗来做同样的事情。我尝试过更改设置;每种可能的波特率,较短的电缆等。Beagle内必须为此类工作进行某些配置/配置错误。

代码

#!/usr/bin/env python
# -*- coding; utf-8 -*-

import minimalmodbus
import serial
import time

i = minimalmodbus.Instrument(port='/dev/ttyUSB0', slaveaddress=1, mode='rtu')
i.serial.baudrate = 115200
i.serial.bytesize = 8
i.serial.parity = serial.PARITY_EVEN
i.serial.stopbits = 1
i.serial.timeout = 1
i.handle_local_echo = None

while True:
    try:
        print(i.read_registers(2008, 2, 3))
    except serial.serialutil.SerialException as error:
        print(error)
    except FileNotFoundError as error2:
        print(error2)
    except IOError as error3:
        print(error3)
    time.sleep(1)

...使用USB/RS485加密狗。使用这种加密狗/代码组合可以在我的计算机上(过去4个月)获得完美的结果,但今天的Beagle却无法。

计算机:收到的消息:

[0, 0]

小猎犬:收到错误:

IOError: No communication with instrument (no answer)

我正在寻找故障排除的可能途径。我已经确认电缆不太长,并且USB软件狗还可以。我还排除了任何代码问题。

编辑1: 忘记包含lsusbls /dev/ttyUSB*

Bus 002 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 002 Device 003: ID 04d9:0024 Holtek Semiconductor, Inc.
Bus 002 Device 002: ID 0409:0059 NEC Corp. HighSpeed Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

/dev/ttyUSB0

编辑2:

我可以使用pyserial并将Rxd和Txd +和-端子短路来实现回送设置。

编辑3:

我尝试了所有可能的接线配置。在计算机上只有一种配置可用(Tx +-> A和Tx--> B)。使用minimalmodbus调试功能时,可以看到相同的消息正在发送到Beagle和计算机上的设备('\x01\x03\x07Ø\x00\x02ED' (01 03 07 D8 00 02 45 44) )。计算机收到响应,而小猎犬则没有。

Beagle轻松将适配器安装到/dev/ttyUSB0

编辑4:

@Carlo Zanocco请求输出ls /dev/ | grep tty

tty
tty0
tty1
tty10
tty11
tty12
tty13
tty14
tty15
tty16
tty17
tty18
tty19
tty2
tty20
tty21
tty22
tty23
tty24
tty25
tty26
tty27
tty28
tty29
tty3
tty30
tty31
tty32
tty33
tty34
tty35
tty36
tty37
tty38
tty39
tty4
tty40
tty41
tty42
tty43
tty44
tty45
tty46
tty47
tty48
tty49
tty5
tty50
tty51
tty52
tty53
tty54
tty55
tty56
tty57
tty58
tty59
tty6
tty60
tty61
tty62
tty63
tty7
tty8
tty9
ttyGS0
ttyS0
ttyS1
ttyS2
ttyS3
ttyS4
ttyS5
ttyUSB0

编辑5:

stty -F /dev/ttyUSB0 -a的输出:

speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 0; time = 0;
parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany
-imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl
-echoke -flusho -extproc

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,结果证明这是终止和流量控制的问题

我尝试了不同的USB加密狗,它们都可用于PC和Mac,以及BeagleBone上的许多不同配置,但是没有任何效果。

低成本的USB加密狗在PC上可以很好地工作,但是在微控制器(例如BeagleBone)上,您需要能够更好地处理总线规范的东西。

我发现,某些简单且低成本的 TTL RS232至RS485 板在BeagleBone侧上无需任何特殊配置即可完美工作,因为它们可以自动管理流量控制。 您可以在Ebay或类似网站上搜索RS485 automatic flow control

由于BeagleBone上的默认串行端口已经连接到系统控制台,因此需要enable another UART来正确编辑文件/boot/uboot/uEnv.txt。

然后,您需要将5V电源和GND(在P9_5和P9_1引脚上可用)和正确的串行引脚(如果已启用UART1,则为P9_26和P9_24)连接到适配器的5V,GND,RX和TX连接器(不必理会RTS和CTS,因为适配器将为您管理它们。

在代码中将端口名称更改为新的串行端口(即,如果启用了UART1,则为/ dev / ttyO1)。

要轻松调试代码,您可以通过RS485线连接PC上的USB加密狗和BeagleBone上的适配器,并打开两个串行端子。