2017-02-14 59 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