2017-05-28 59 views
0

我有一個電磁控制硬件,我試圖用於Access系統,根據設備的手冊我發送命令到設備,狀態,但我只收到空白行。使用python樹莓派從串口設備獲取數據的問題3

命令知道端口的estatus如下:

  • 讀鎖定狀態命令(的門開關狀態的反饋) 開始板地址鎖地址命令校驗碼(XOR) 0X80 0X01 - 0XF 0X00-32 0X33 XX 鎖地址爲0X00,返回所有鎖的狀態,如果不是0,則返回此鎖狀態。

    例如: a。返回到鎖定的狀態1 如:上位機發送0x80的0X01 0X01 0X33 0XB2(十六進制), 回報 司令部板地址鎖定地址狀態檢查鱈魚 0x80的0X01 0X01 0X11 0X91(鎖打開) 0x80的0X01 0X01 0X00 0x80的(鎖定關閉 b返回回所有的鎖的狀態:

  • 如:主機發送0x80的0X01 0X00 0X33 0XB2(十六進制),返回 起板地址狀態1狀態2 STATUS3 STATUS4 STATUS5 STATUS6 STATUS7

    命令檢查碼 0X80 0X01 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF 0X33 0XXX

    狀態:從狀態1到狀態7,從高到低,相應的鎖是1-50。

    這是我的代碼:

    #!/usr/bin/env python 
    
    # based on tutorials: 
    # http://www.roman10.net/serial-port-communication-in-python/ 
    # http://www.brettdangerfield.com/post/raspberrypi_tempature_monitor_project/ 
    
    import serial, time 
    
    SERIALPORT = "/dev/ttyUSB0" 
    BAUDRATE = 9600 
    
    ser = serial.Serial(SERIALPORT, BAUDRATE) 
    
    ser.bytesize = serial.EIGHTBITS #number of bits per bytes 
    
    ser.parity = serial.PARITY_NONE #set parity check: no parity 
    
    ser.stopbits = serial.STOPBITS_ONE #number of stop bits 
    
    #ser.timeout = None   #block read 
    
    #ser.timeout = 0    #non-block read 
    
    ser.timeout = 2    #timeout block read 
    
    ser.xonxoff = False  #disable software flow control 
    
    ser.rtscts = False  #disable hardware (RTS/CTS) flow control 
    
    ser.dsrdtr = False  #disable hardware (DSR/DTR) flow control 
    
    ser.writeTimeout = 0  #timeout for write 
    
    print 'Starting Up Serial Monitor' 
    
    if ser.isOpen(): 
    
        try: 
         ser.flushInput() #flush input buffer, discarding all its contents 
         ser.flushOutput()#flush output buffer, aborting current output 
    
         ser.write (serial.to_bytes([0X80,0X01,0X33,0XB2])) 
         print("write data: 0X80,0X01,0X33,0XB2") 
         time.sleep(0.5) 
         numberOfLine = 0 
    
         while True: 
    
          response = ser.readline() 
          print("read data: " + response) 
    
          numberOfLine = numberOfLine + 1 
          if (numberOfLine >= 8): 
           break 
    
         ser.close() 
    
        except Exception, e: 
         print "error communicating...: " + str(e) 
    
    else: 
        print "cannot open serial port " 
    

    這是我的結果:

    讀取數據: 讀取數據: 讀取數據: 讀取數據: 讀取數據: 讀取數據: 閱讀數據: 閱讀數據:

    你能幫我嗎我做錯了什麼?

    +0

    您正在使用'readline',但在'ser.write(...'Data。'末尾沒有'\ n'。 – stovfl

    +0

    感謝您的幫助@stovfl,您可以幫我解釋一下語法,我是新的Python編程,所以我不敢肯定,如果我承認你的建議,謝謝。你的意思是:'ser.write(serial.to_bytes([0X80,0X01,0X33,0XB2 \ n]))' –

    回答

    0

    評論 ...文件:鏈接

    1. 你的命令[0x80,0x01,0x33,0xB2]是錯誤
      使用

      ser.write ([0x80, 0x01, 0x01, 0x33, 0xB2]) 
      

      ser.write ([0x80, 0x01, 0x00, 0x33, 0xB2]) 
      
    2. 讓我們來看看,如果pySerial看到你的串行端口和電磁閥控制硬件
      執行以下並檢查輸出:

      python -m serial.tools.list_ports 
      
    3. 之間

      ser.bytesize 
      ... 
      ser.writeTimeout 
      

      使用刪除ALL設置默認此代碼:

      ser = serial.Serial(SERIALPORT) 
      

    更改爲以下:

    ser.write ([0x80, 0x01, 0x00, 0x33, 0xB2]) 
    

    你已經有binary數據,因此不需要編碼。 閱讀pySerial 3.0 documentation
    serial.to_bytes(sequence)

    我不確定你的命令,你的問題的描述是有些不清楚。
    您是否有公開鏈接到電磁控制硬件的文檔。

    +0

    我可以與您分享硬件製造商發送的通信協議 –

    +0

    以下是文檔: [鏈接](http://www.clasifica24.com/sites/default/files/docs/controller-lock.txt) –

    +0

    @ OscarSilva:已更新答案 – stovfl