2016-07-28 12 views
2

私はArduinoの上のシリアルデータの複数の行を読み取るしようとしている場合、私は、次のイディオムを使用シリアルバッファから読み出すことに利用可能なバイト数を返しSerial.available()アルドゥイーノCにおいてpyserialでSerial.available()と同等のものは何ですか?

String message = ""; 
while (Serial.available()){ 
    message = message + serial.read() 
} 

(見ますDocs)。 Serial.available()のpythonに相当するものは何ですか?例えば

Iシリアルデータの複数の行を読み取る必要がある場合、私は、次のコードをUEに期待:

import serial 
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=0.050) 
... 
while ser.available(): 
    print ser.readline() 
+0

'Serial.available()'の内容を記述するか、そのドキュメントへのリンクを提供してください。 –

答えて

2

「受信バッファ内のバイト数」を返すSerial.in_waitingプロパティ。

これはSerial.available()の説明と同じであると思われます。「バイト数が既に到着し、シリアル受信バッファに格納されています。」

てみてください。.inWaiting()を使用し、3.0をpyserial前のバージョンの

import serial 
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=0.050) 
... 
while ser.in_waiting: # Or: while ser.inWaiting(): 
    print ser.readline() 

。 pyserialのバージョンを確認するには、次のようにしてください:

import serial 
print(serial.__version__) 
+0

'pyserial'の入門チュートリアルでは、' ser.in_waiting'というコマンドは見たことがありません。それが避けられる理由はありますか? 'Serial.available()'はArduino Cのシリアル通信で遍在しています。 Python開発者は、通常同じタスクを達成するために別のイディオムを使用しますか? –

+0

AttributeError: 'シリアル'オブジェクトに 'in_waiting'属性がありません root @ raspberrypi:/ home/wf#python3 --version Python 3.4。2 –

+0

@WolfgangFahl - あなたのバージョンの 'pyserial'が3.0より古い場合、' .inWaiting() 'を試してください。 –

-1

私は以下のように自分のコードを書いています。コードを変更することができますか?

import serial 
import csv 
import os 
import time 
import sys 
import string 
from threading import Timer 

def main(): 
    pass 

if __name__ == '__main__': 
    main() 
    COUNT=0 

    f=open("test.csv","w+"); 
    result = csv.writer(f,delimiter=',') 
    result_statement=("Dir","ACTUATOR_ON_OFF","MODE","DATE","TIME"," TRACKER DESIRED ANGLE"," TRACKER ACTUAL ANGLE") 
    result.writerow(result_statement) 
    f.close() 
    while COUNT<=100: 
    #while(): 
     time.sleep(60) 
     ser=serial.Serial() 
     ser.port=12 
     ser.baudrate=9600 
     ser.open() 

     str=ser.read(150) 
     # print "string are:\n",str 
     print type(str) 
     val=str.split(":") 
     # print "value is:\n",val 
     lines=str.split("\r\n") 
    # print "line statement are :\n",lines 
     COUNT=COUNT+1 
     print COUNT 
     f=open("test.csv","a+"); 
     result = csv.writer(f,delimiter=',') 
     wst=[] 
     for line in lines[:-1]: 
      parts=line.split(":") 
      for p in parts[1:]: 
       wst.append(p) 


      #result = csv.writer(f,delimiter=',') 
      #wst.append(parts[1:]) 

     print "wst:\n",wst 
     result.writerow(wst) 
     f.close() 
f.close() 
ser.close() 
+0

フィードバックAjitありがとうございますが、あなたのコードは残念ながら私の問題に対処していません。どのくらいのデータがあるかを確認するのではなく、 'ser.read(150)'で150バイトのシリアルデータが利用可能であると想定するだけです。いくつかの追加のヒント、このコードの多くは、pythonのように(短い、クリーナー、速く、読みやすく)改善することができます。 'f = open()'、 'f.close()'、 'ser.close()'の再生で 'with'キーワードを使ってみてください。さらに、 'COUNT <= 100:'の間は、ゼロインデックス付けが問題であれば 'for i in xrange(100)'または 'for i in xrange(1,101) 'に置き換えてください。 –

0

私はそういう同じ問題を解決しました。このコードの唯一の欠点は、最初に文字 'a'を送信するときに、ser.inWaiting()が0を返します。このエフェクトを削除するには、その前に1秒の遅延を追加しました。それは問題を解決するようです。

私の場合、ATmega16は8または12bitsの文字列を返します。ですから、ser.inWaiting()でRPiに到着するビット数を取得し、そのデータをser.read()で読み取ってser.read(ser.inWaiting())に結合します。

import RPi.GPIO as GPIO 
from time import sleep 
import serial # version is 3.2.1 

ser = serial.Serial('/dev/rfcomm0', 9600) 
ser.parity = serial.PARITY_ODD 
ser.parity = serial.PARITY_NONE 

GPIO.setmode(GPIO.BOARD) 

led1 = 16 
led2 = 18 
button = 7 

GPIO.setup(led1, GPIO.OUT) 
GPIO.setup(led2, GPIO.OUT) 
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP) 

try: 
    while True: 
     choice = raw_input("Enter 'a' if you want to turn LED ON or 'b' " 
         + "to turn the LED OFF: ") 
     if (choice == "a"): 
      print "Sending command to turn LED ON" 
      GPIO.output(led1, GPIO.HIGH) 
      sleep(1) 
      GPIO.output(led1, GPIO.LOW) 
      #Send the actual data 
      ser.write('a'); 
      #Receive what ATmega it send back 
      sleep(1) 
      received_data = ser.read(ser.inWaiting()) 
      print "Received data: " + received_data 

     elif (choice == "b"): 
      print "Sending command to turn LED OFF" 
      GPIO.output(led2, GPIO.HIGH) 
      sleep(1) 
      GPIO.output(led2, GPIO.LOW) 
      #Send the actual data 
      ser.write('b'); 
      #Receive what ATmega it sends back 
      sleep(1) 
      received_data = ser.read(ser.inWaiting()) 
      print "Received data: " + received_data 

     else: 
      print "Invalid command" 
      GPIO.output(led1, GPIO.HIGH) 
      GPIO.output(led2, GPIO.HIGH) 
      sleep(.3) 
      GPIO.output(led1, GPIO.LOW) 
      GPIO.output(led2, GPIO.LOW) 
      sleep(.3) 
      GPIO.output(led1, GPIO.HIGH) 
      GPIO.output(led2, GPIO.HIGH) 
      sleep(.3) 
      GPIO.output(led1, GPIO.LOW) 
      GPIO.output(led2, GPIO.LOW) 
      #send invalid command 
      ser.write(choice); 
      #receive what ATmega sends back 
      sleep(1) 
      received_data = ser.read(ser.inWaiting()) 
      print "Received data: " + received_data 

finally: 
    GPIO.cleanup() 
0

正解はPythonのバージョンに依存しますが、これは今日私をしばらくトライしてしまいました。私はいくつかのコメントが現在Python 2.7.9にあるRaspberry Piと同様に現在のpySerialよりも少なく実行されていたと考えています。

Piでは、Arduino CのSerial.available()に似ているser.inWaiting()を使用することができます。両方とも受信バッファのバイト数を返します。 PI(おそらく古いニシキヘビ/ pySerialsと)属性エラーにimport serial ; print (serial.__version__)結果に関するちなみに

が、新しいバージョンで動作します - pySerial> = 3.0のために、あなたは(http://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.in_waitingこれは属性ではない機能であることに注意)ser.in_waitingを使用しています。

関連する問題