2015-04-03 79 views
0

我想讓使用RaspberryPi的zigbee設備一起說話。 我正在使用Xbee「擴展」和serie 1終端設備。 他們目前正在傳輸數據,我想爲圖書館提取一個特定的數據。我的代碼很簡單。我該如何管理這個錯誤:TypeError:參數必須是int,或者有一個fileno()方法

#coding: utf 
#!/usr/bin/python 
import serial 
# for serie 1 componants 
from xbee import XBee 
# for serie 2 componants 
#from xbee import ZigBee 


############################################################## 
def CalcDCAmps(data): 
    mes = (data*20)/1024 # conversion 0-1023 en 0-20mA 

    if (mes <4) : #si la valeur reçues est inférieure à 4mA 
     return -1 # problème sur le capteur 
    else : 
     return (mes*50)/20 # conversion 4-20mA en 0-50A 

############################################################## 


# Open serial port 
serial_port = serial.Serial('/dev/ttyAMA0', 9600) 

# Create XBee Series 1 object 
zb = XBee(serial_port) 
#zb = ZigBee(serial_port) 



while True: 
    j = 0; 
    data_int = ""; 

    try: 
     data = zb.wait_read_frame() #Get data for later use 
     #print data # for debugging only 
     print data['samples']# print the data frame of the list 
     # frame type received[{'adc-0': 1023}] 

     sample = str(data['samples']) #transformation de l'élément de la bibliothèque en chaîne de caractères 
    #print "Equivalent String : %s" % sample 

     for i in range(len(sample)): # boucle pour isoler les chiffres de la chaîne de caractères 
      if ((sample[i]>='0') & (sample[i]<='9')) : 
       data_int += sample[i] # stockage des chiffres dans une nouvelle chaîne de caractères 

     data_int = int(data_int) # conversion de la chaîne de caractère en entier 
     print "Valeur extraite:", data_int 

     courant = CalcDCAmps(data_int) 
     print "Courant DC: ", courant, "A" 

    except KeyboardInterrupt: 
     break 

    serial_port.close() 

(對不起,法國評論) 當我計算它這樣出現:

[{'adc-0': 172}] 
Valeur extraite: 172 
Courant DC: -1 A 
Traceback (most recent call last): 
    File "conversion_v3.py", line 36, in <module> 
    data = zb.wait_read_frame() #Get data for later use 
    File "/usr/local/lib/python2.7/dist-packages/xbee/base.py", line 399, in wait_read_frame 
    frame = self._wait_for_frame() 
    File "/usr/local/lib/python2.7/dist-packages/xbee/base.py", line 117, in _wait_for_frame 
    if self.serial.inWaiting() == 0: 
    File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 431, in inWaiting 
    s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str) 
TypeError: argument must be an int, or have a fileno() method. 

現在我不知道如何去管理它。請幫幫我。

回答

1

您正在關閉循環內的串行端口,所以它在第一次迭代後不能再讀取幀。

+0

很多很多謝謝! – PiXieBulles 2015-04-03 13:32:15

相關問題