我是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
(带或不带参数),但是我要么使用不正确,要么不完全是我想要的。任何帮助是极大的赞赏!谢谢。
ser.write([CID,0x17,0x20,0x01, ...
CID
进入包含一堆整数的列表。但是它本身是一个字符串。
您想保留CID为整数。
# CID = '0x{:02x}'.format(i).encode('ascii')
CID = i
您需要缩进def Init_Sync_4 ():
函数之后的代码,否则它将无法运行。
ser.write([CID, ...])
函数中的字符必须在“”之间,否则将不会被解释为字符串。
您收到的错误提示您要发送的字符串必须为一号,因此必须一一发送:
chars = [CID, "0x17", "0x20", "0x01", ...]
for c in chars:
ser.write(c)
尝试一下是否可行。