2016-10-22 9 views
0

私はUART経由で2つのラズベリーピスの間に文字列を送信しようとしています。これまでのところ、1つのPiは文字列を送信することができ、2つ目のPiは受信することしかできません。 1つのPiから別のPiに「コマンド」を送信しようとすると、2つ目のPiは「コマンド」を受信し、最初のPiに「センサーデータ」を返します。しかし、これは動作していないようです。私はデータを送受信することができません。Python UART between 2 Raspberry Pis

ご協力いただければ幸いです。

コマンドを送信しているラズベリーパイ:

import serial 

ser = serial.Serial(
    port = '/dev/ttyAMA0',\ 
    baudrate = 115200,\ 
    bytesize = serial.EIGHTBITS,\ 
    timeout = 0) 

dat = '' 

while True: 
    #asks user for input 
    command = raw_input() 
    #terminates command with null 
    ser.write(command + '\0') 

    #reads data per char 
    for c in ser.read(): 
     #appends string 
     dat += c 
     #terminates at null char 
     if c == '\0': 
      print(dat) 
      dat = '' 
      break 
ser.close() 

コマンドを受信し、センサデータを送信し、このRPI:

import serial 

ser = serial.Serial(
    '/dev/ttyAMA0' ,\ 
    baudrate = 115200 ,\ 
    bytesize = serial.EIGHTBITS ,\ 
    timeout = 0) 

dat = '' 
sen1 = 'sen1\x00' 
sen2 = 'sen2\x00' 
com1 = 'hello' 
com2 = 'this thing works!' 
com3 = 'error!' 

while True: 

    #reads data per char 
    for c in ser.read(): 
    #appends string 
    dat += c 
    #terminates at null char 
    if c == '\0': 
     #decides which sensor to choose 
     if dat == sen1: 
      print(com1) 
      ser.write(com1 + '\0') 
      dat = '' 
      break 
     elif dat == sen2: 
      print(com2) 
      ser.write(com2 + '\0') 
      dat = '' 
      break 
     else: 
      print(com3) 
      ser.write(com3 + '\0') 
      dat = ''   

ser.close() 

答えて

0

原因は、ほとんどの場合、あなたはゼロタイムアウトです。結果としてread()を非ブロックに設定したので、送信者のPiのforループは何も読み取られない(または1バイトのみ)可能性があり、すべてが到着する前に終了します。また、ser.read()を反復することは、デフォルトではバイトだけを返すので、実際には意味をなさない。

タイムアウト値がゼロ以外の値に増加します。

ser = serial.Serial(
    '/dev/ttyAMA0' ,\ 
    baudrate = 115200 ,\ 
    bytesize = serial.EIGHTBITS ,\ 
    timeout = 0.1) 

あなたが別のコマンドが送信される前に、これは送信者のために働く必要があり、コマンドに対する応答を受信したいと仮定:

while True: 
    #asks user for input 
    command = raw_input() 
    #terminates command with null 
    ser.write(command + '\0') 

    dat = [] 
    lastRead = time.time() 
    while time.time() - lastRead < 0.1: 
     while ser.inWaiting() > 0: 
      dat.append(ser.read()) 
      lastRead = time.time() 
    if dat and (dat[-1] == '\0'): 
     print(''.join(dat[:-1])) 

場合は別のバイトが使用可能になる前に、100ミリ秒以上経過、しばらくループブレイクし、最後に受信したバイトをチェックして、ヌルバイトであるかどうかを確認します。あなたの受信機に似たようなものがあります:

while True: 
    dat = [] 
    lastRead = time.time() 
    while time.time() - lastRead < 0.1: 
     while ser.inWaiting() > 0: 
      dat.append(ser.read()) 
      lastRead = time.time() 
    dat = ''.join(dat) 
    # begin your comparisons here 
+0

ありがとうございます。残念ながら、あなたのコードは私のためには機能しませんでした。 – Patattack760

+0

inter_byte_timeoutはコンパイルされません。簡単なGoogle検索の後、同じことをすると思われるinterCharTimeoutが見つかりました。その変更の後、プログラムはコンパイルされましたが、私の問題は解決しませんでした。最初のPiに「sen1」というコマンドを入力すると、2番目のPi(受信者)は「センサーデータ」を送信しません。不思議なことに、1つのコマンドを入力すると、2番目のコマンドは受信されません。私はこれを知っています。私は2番目のPi(受信者)に、最初のPiからのコマンドを受け取るすべてのものを印刷するように依頼するからです。 – Patattack760

+0

@ Patattack760自分の編集を参照 – TisteAndii