2017-04-23 24 views
0

私はいくつかのGPIOの値を読み取ろうとしています。ここでは、コードです:Pythonシリアル:ポートの読み込みに問題があります

import serial 
import codecs 
import time 

ser = serial.Serial(port = 'COM4', baudrate = 9600, \ 
        parity = serial.PARITY_NONE, \ 
        stopbits = serial.STOPBITS_ONE, \ 
        bytesize = serial.EIGHTBITS, \ 
        timeout = 0, \ 
        ) 
print('connected to: ',ser.name) 
ser.close() 

def SSend(input): 
    ser.write(codecs.decode(input, "hex_codec")) #send as ASCII 
    print('sent: ', input) 

def ReadIO(): 
    #open the port 
    try: 
     ser.open() 
    except: 
     print('error opening serial port') 
     exit() 

    #flush the buffers 
    ser.flushInput() 
    ser.flushOutput() 

    #write data to read from GPIO 
    #causes SC18IM to return a byte containing each of the 8 I/O values 
    SSend(b'4950') 
    time.sleep(0.1) #allow time for the data to be received 


    #read the data 
    serialData = False 
    serialData = ser.readline() 
    ser.close() 

    return serialData 

while 1: 
    print(ReadIO()) 
    time.sleep(0.5) 

これは次のように出力されます

送ら

: b'4950'

B ''

(私は戻っては0x00または0x20の代わりのいずれかを期待しています空のバイト)

Realtermを使用していて、正常に書き込みコマンドを受け取ったときに私が期待しているものが返ってくるので、他の場所で私のスクリプトで。それが働いた理由

は、私はこの

#read the data 
serialData = False 
for c in ser.readline(): 
    print('in loop') 
    print(c) 
    serialData = c 
ser.close() 

を使用して、いくつかの運を持っていたしかし、私は本当に理解していないとそれだけで断続的に動作するように表示されます。

読んでいただきありがとうございます。

答えて

0

readline()は、\nまたは\rのような行末記号があると想定しています。あなたはバイト単位でデータを読むべきです:

serialData = '' 
while ser.inWaiting() > 0: 
    c=ser.read(1) 
# or c=ser.read(1).decode('latin1') 
    serialData += c 
+0

ああ、私は今すぐ参照してください。それをクリアしていただきありがとうございます。問題のもう1つは、スレーブがASCII文字でシリアルデータを送信していたことです。この問題は 'binascii.hexlify(data)'を使って修正されました。 – Jack

関連する問題