Raspberry PI 3,SerialPort和奇怪的响应

时间:2017-11-04 01:33:34

标签: python raspberry-pi bit-manipulation pyserial

我试图用串行端口(插孔)控制我的旧Samsung DLP SP-A600B。为此,我已经重新使用了我的Raspberry Pi 3,并且我已经在网上插入了USB到Jack电缆(UART)。

我制作了一个小的Python文件,但我不理解我收到的输出。这是我的代码:

import time
import serial

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.SEVENBITS
)

ON = b"\x08,\x22,\x00,\x00,\x00,\x00,\xD6"
# other hard-coded commands

ser.write(ON)
time.sleep(1)
out = ser.read(3)

# 0x03 0x0C 0x7F doesn't match the spec!

print out
ser.close()

根据to the manual

  

5-2 RS-232C命令表

     

通信格式(符合RS232C标准)

     
      
  • 波特率:9,600 bps
  •   
  • 胎次:无
  •   
  • 数据位:8,停止位:1
  •   
  • 流量控制:无
  •   
     

串行通信协议

     
      
  1. 命令包结构[7bytes]      
        
    • 命令包总共包含7个字节。
    •   
    • 两个字节0x08和0x22表示该数据包用于串行通信。
    •   
    • 以下4个字节表示可由用户定义的预定义命令。
    •   
    • 最后一个字节是校验和,用于检查当前数据包的有效性。
    •   
    • 标题[2 Byte]:预定义值固定为0x08和0x22。
    •   
    • Cmd1 [1 Byte]:命令列表中定义的代码的第一个值(十六进制)
    •   
    • Cmd2 [1 Byte]:命令列表中定义的代码的第二个值(十六进制)
    •   
    • Cmd3 [1 Byte]:命令列表中定义的代码的第三个值(十六进制)
    •   
    • 值[1 Byte]:命令的输入参数(默认值:0)(十六进制)
    •   
    • CS [1 Byte]:校验和(除了CS值之外的所有值之和的2的补码。)
    •   
  2.   
  3. 响应数据包结构[3字节]

         
        
    1. 成功
    2.         

      0x03 0x0C 0xF1

           
          
      1. 故障
      2.         

        0x03 0x0C 0xFF

          

我使用这个website来计算第7个字节(D6)的2的补码(我更多的NodeJS / Android人)。不幸的是,我只收到

0x03 0x0C 0x7F

用于此命令。如果我尝试设置serial.PARITY_ODD或serial.EIGHTBITS等奇怪的值,我会收到失败的数据包

0x03 0x0C 0xFF

我没有成功收到一个成功的数据包。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

正如我们最终在评论中解决的那样,问题是命令字符串中有多余的逗号,数据需要是8位。

因此,具体而言,请使用:

bytesize=serial.EIGHTBITS
...
...
ON = b"\x08\x22\x00\x00\x00\x00\xD6"