遍历所有串行地址以查找硬件

问题描述 投票:0回答:2

我是python的新手,我试图遍历所有255个地址以通过RS485定位特定的硬件位。硬件已连接,其地址应该为0x25,但事实并非如此,因此我需要find它的地址是什么。

到目前为止,我有:

def Init_Sync_4 ():
GPIO.output(18,GPIO.HIGH)
ser.write([CID,0x17,0x20,0x01,0x14,0x1c,0x04,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x00,0$
time.sleep(0.007)
GPIO.output(18,GPIO.LOW)

ser=serial.Serial(port='/dev/serial0',baudrate=38400,stopbits=2,timeout=1)

GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.OUT)
GPIO.output(18,GPIO.LOW)

for i in range(0xff):
    CID = '0x{:02x}'.format(i).encode('ascii')
    print "at address %s" % CID

    Init_Sync_4()
    time.sleep(0.05)

    Init_2()
    time.sleep(0.05)

CID是正在构建的地址,Init_Sync_4()ser.write的字节数组中使用该地址,但我不断收到错误:

at address 0x00
Traceback (most recent call last):
  File "rs485_test_2.py", line 97, in <module>
    Init_4()
  File "rs485_test_2.py", line 40, in Init_4

ser.write([CID,0x17,0x20,0x01,0x14,0x1c,0x04,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x00,0x00,0x00])
      File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 518, in write
        d = to_bytes(data)
      File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 66, in to_bytes
        return bytes(bytearray(seq))
    ValueError: string must be of size 1

我假设当它需要为单个字节时,它仍作为字符串传递,但是我对转换的工作方式迷失了。我已经签出了一些SO页面,这些页面指定使用.encode(带或不带参数),但是我要么使用不正确,要么不完全是我想要的。任何帮助是极大的赞赏!谢谢。

python pyserial
2个回答
0
投票
ser.write([CID,0x17,0x20,0x01, ...

CID进入包含一堆整数的列表。但是它本身是一个字符串。

您想保留CID为整数。

# CID = '0x{:02x}'.format(i).encode('ascii')
CID = i

0
投票

您需要缩进def Init_Sync_4 ():函数之后的代码,否则它将无法运行。

ser.write([CID, ...])函数中的字符必须在“”之间,否则将不会被解释为字符串。

您收到的错误提示您要发送的字符串必须为一号,因此必须一一发送:

chars = [CID, "0x17", "0x20", "0x01", ...]
for c in chars:
    ser.write(c)

尝试一下是否可行。

© www.soinside.com 2019 - 2024. All rights reserved.