0

我在解码 DLE EOT 1 时遇到问题,我认为它的位顺序和缺少前导零

import serial
x = 1
while x:
   time.sleep(3)
   ser.write("\x10\x04\x01".encode())  
   bytesToRead = ser.inWaiting()
   data = ser.read(bytesToRead)
   while data:
      print(data)
      print(bin(int.from_bytes(data, byteorder="big")))
      print(bin(data[0])[2:])
      data = ""

所以这是在就绪和在线状态时返回的内容:

b'\x16'
0b10110
10110

这是门打开“假定离线状态”时返回的内容:

b'\x1e'
0b11110
11110

怎么翻译?我不需要8位回来吗?

爱普生电调手册节选:

每个状态由 1 个字节组成,值为 0xx1xx10b。实时状态可以通过比特 0、1、4 和 7 与其他传输数据区分开来,除了块数据中的数据(Header – NUL)。

位二进制状态|十六进制|十进制
====+=============================================== =+===+======
0 | 0 | 固定 |00 |0 |
----+---+-------------------------- -+----+-----+
1 | 1 | 固定 |02 |2 |
----+---+-------------------------- -+----+-----+
2 | 0 | 抽屉踢出连接器插针 3 为低电平 |00 |0 |
    | 1 | 抽屉踢出连接器插针 3 为高电平 |04 |4 |
----+---+-------------------------- -+----+-----|
3 | 0 | 在线 |00 |0 |
    | 1 | 离线 |08 |8 |
----+---+-------------------------- -+----+-----|
4 | 1 | 固定 |10 |16 |
----+---+-------------------------- -+----+-----|
5 | 0 | 不等待联机恢复 |00 |0 |
    | 1 | 等待在线恢复 |20 |32 |
----+---+-------------------------- -+----+-----|
6 | 0 | 未按下进纸按钮 |00 |0 |
    | 1 | 正在按下进纸按钮 |04 |64 |
----+---+-------------------------- -+----+-----|
7 | 0 | 固定 |00 |0 |
-------------------------------------------------- ------------
4

1 回答 1

0
 print(bin(data[0])[2:].zfill(8)[::-1])

这将添加前导零并反转位。结果:在线状态:

                            /---------Bit 3
00010110  -> reversed =  01101000
0xx1xx10b -> reversed = b01xx1xx0
                            ^---------Bit 3
于 2018-03-09T06:02:23.330 回答