2017-02-14 20 views
1

我正在使用一些由Fraser May編寫的MCP8004(adc)的代碼,我修改了MCP3002連接到Raspberry Pi 1B +,現在正試圖將收集的數據發送到sparkfun服務器,只有我發現我嘗試抓取數據返回一個空字符串。我是Python的新手,但有一些來自學校(ME)的編碼經驗。Python:這種格式化工作如何提取正確的數據?

這是我必須收集ADC數據:

def getAdc (channel): 
     #check valid channel 
     if ((channel>1)or(channel<0)): 
      return -1 

     # Preform SPI transaction and store returned bits in 'r' 
     r = spi.xfer([1, (4+2+channel) << 4, 0]) 

     #Filter data bits from retruned bits 
     adcOut = ((r[0]&3) << 8) + r[1] 
     percent = int(round(adcOut/10.24)) 

     #print out 0-1023 value and percentage 
     print("ADC Output: {0:4d} Percentage: {1:3}%".format (adcOut,percent)) 
     sleep(1) 
     return adcOut 
在我的腳本將數據發送給我做這個(加修飾phant東西)服務器

現在:

adcOut=[] 
while True: 

      print("collecting data") 
      adc = []   #sets adc as a list 

      for i in range(2): 
        getAdc(i) 
        adc.append(adcOut) 
        print adcOut 
      print("ADC data collected!") 

我想我可以撥打adc[0]adc[1]來獲得我想要的數據,它顯示在getAdc函數中,但顯然不是,我得到一個空列表([])。

我認爲我的問題是在getAdc發生了什麼,其中{0:4d}{1:3}被使用,但我不確定那些是做什麼的。任何人都可以幫助打破這部分?到目前爲止,我所能找到的都是解釋什麼是d%的文檔,但在我這裏應用時,它們對我沒有意義。

在此先感謝!

*備註:adcOut已在我的getAdc腳本之前聲明爲全局。

+3

您應該讓'getAdc'返回值而不是僅僅打印它們。 – BrenBarn

+1

'adcOut'在哪裏填充值?你爲什麼不把'getAdc(i)'存儲在一個變量中? – Dan

+0

哎呀,編輯糾正。我使用的代碼在最後「返回adcOut」......我從我在PC上的文件複製了此文件,而不是我的Pi上的確切版本。我的麻煩似乎在拉我從adcOut中得到的東西。 adcOut在getAdc(頂部代碼)中填充,進一步向下調用getAdc(底部代碼)來抓取adcOut – gr8flux

回答

2

選項1: 您需要指示您要修改全局adcOut變量,而不是隻讀取其值。修改getAdc()加入一個global adcOut的功能如下:

def getAdc (channel): 
    global adcOut # <-- this line is added 
    #check valid channel 
    if ((channel>1)or(channel<0)): 
     return -1 

    # Preform SPI transaction and store returned bits in 'r' 
    r = spi.xfer([1, (4+2+channel) << 4, 0]) 

    #Filter data bits from retruned bits 
    adcOut = ((r[0]&3) << 8) + r[1] 
    percent = int(round(adcOut/10.24)) 

    #print out 0-1023 value and percentage 
    print("ADC Output: {0:4d} Percentage: {1:3}%".format (adcOut,percent)) 
    sleep(1) 

選項2: 或者,您也可以通過添加return adcOut到函數的結束,並在您的調用點更改代碼返回ADCOUT如下:

adcOut=[] 
while True: 

     print("collecting data") 
     adc = []   #sets adc as a list 

     for i in range(2): 
       adcOut = getAdc(i) # <-- note this changed line 
       adc.append(adcOut) 
       print adcOut 
     print("ADC data collected!") 

更好的選擇,國際海事組織,是#2 - 返回ADCOUT而不是使用全局變量。

+0

意想不到的Vijay Varadan,謝謝!沒想到會成爲問題,很高興你發現它。 – gr8flux