1

万一我的问题在下面丢失了,我需要向我的家庭自动化系统展示一个数组,我可以逐个单元格地从中检索信息。

我正在使用以下代码从轮询我的家庭 HVAC 系统的串行设备中读取(其中大部分是从其他人的帖子中复制的很差):

import time
import serial
import StringIO

# configure the serial connections
ser = serial.Serial(
        port='/dev/ttyS0',
        baudrate=9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS
)

input=1
while 1 :
        # Use static command to debug
        input = "stats"
        # Python 3 users
        # input = input(">> ")
        if input == 'exit':
                ser.close()
                exit()
        else:
                # send the character to the device
                # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
                ser.write(input + '\r\n')
                outputFCUData = ''
                # let's wait one second before reading output (let's give device time to answer)
                time.sleep(1)
                while ser.inWaiting() > 0:
                        outputFCUData += ser.read(1)

                if outputFCUData != '':
                        fcuArrayTemp = StringIO.StringIO(outputFCUData).read().splitlines()
                        fcuArrayTemp.pop(0)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                        print fcuArrayTemp
                        exit()

如果我在没有任何格式的情况下轮询设备,结果将是:

stats
101 ON  070F 070F  Low  Heat OK 0
102 ON  069F 069F  Low  Heat OK 0
103 ON  069F 069F  Low  Heat OK 0
104 ON  069F 070F  Low  Heat OK 0
105 OFF 072F 064F  High Heat U5 0
OK
>
>

当我pop(0)pop(-1)代码中的 's 删除我想要的 5 行信息之外的所有信息时。对于任何好奇的人,第一列(例如“101”)是我的风扇线圈名称,然后是状态、设定点、当前温度、风扇速度、模式(加热/冷却)、错误代码(例如 105 没有 t -stat,所以它有一个U5 error) 然后最后一列是向设备发送命令的任何错误 - 现在没有,因此是“0”。

因此,我想获取该输出并将其转换为数组,以便例如调用fcuStatus[i][j]命令将信息从单元格(i,j)中提取出来。

我从我的代码中得到以下信息:

['101 ON  070F 070F  Low  Heat OK 0', '102 ON  069F 069F  Low  Heat OK 0', '103 ON  069F 069F  Low  Heat OK 0', '104 ON  069F 070F  Low  Heat OK 0', '105 OFF 072F 064F  High Heat U5 0']

这是一个 1 行 5 列的列表。我相信我应该只需要从该列表中读取元素并将它们添加到数组中。所以我添加代码:

for element in fcuArrayTemp
    parts = element.split(' ')
    print parts

所以现在我的输出是:

['101', 'ON', '', '070F', '070F', '', 'Low', '', 'Heat', 'OK', '0']
['102', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0']
['103', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0']
['104', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0']
['105', 'OFF', '072F', '064F', '', 'High', '', 'Heat', 'U5', '0']

这与我想要的非常接近,除了由于我在有双空白时在单个空白上拆分而添加了一些额外的列。

我的代码很草率,我必须相信有更好的方法。有人可以告诉我如何获取我在outputFCUData变量中收到的字符串信息并将其转换为没有额外空格的函数数组吗?将始终有 8 列,但随着向系统中添加风机盘管,阵列可以扩展到 128+ 行。以上任何一个都是因为我不太了解,而不是因为我试图遵守一组特定的指导方针——任何建议都非常受欢迎。

编辑-哇-收音机-正是我需要的-谢谢!

for element in fcuArrayTemp
    parts = element.split()
    print parts

所以实际上最后一部分是我如何获取这些有组织的列表并创建一个 N 行 x 8 列矩阵?这个错误是因为没有给出附加参数。将“元素”添加到要追加的项目 (fcuArray.append(element)) 也不能让我到达那里。

fcuArray = []
for element in parts:
    fcuArray = fcuArray.append()
    print fcuArray

再次感谢

编辑:找到了一个适合我的解决方案 - 在这里为其他正在寻找类似东西的人发布。诀窍是在生成列表时将列表中的每一行添加到我的数组中:

fcuArray = []
for element in fcuArrayTemp
    parts = element.split()
    fcuArray.append(parts)

现在我可以通过请求行和位置来报告数组中的任何值。例如,要报告数组中第 3 个风扇线圈的名称,我会要求 fcuArray[3][0](即“print fcuArray[3][0]”,它将返回“104”。

这是我的完整代码:

import time
import serial
import StringIO
import pprint

# configure the serial connections
ser = serial.Serial(
       port='/dev/ttyS0',
       baudrate=9600,
       parity=serial.PARITY_NONE,
       stopbits=serial.STOPBITS_ONE,
       bytesize=serial.EIGHTBITS
)

input=1
while 1 :
        # Use static command to debug
        input = "stats"
        # Python 3 users
        # input = input(">> ")
        if input == 'exit':
                ser.close()
                exit()
        else:
                # send the character to the device
                # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
                ser.write(input + '\r\n')
                outputFCUData = ''
                # let's wait one second before reading output (let's give device time to answer)
                time.sleep(1)
                while ser.inWaiting() > 0:
                        outputFCUData += ser.read(1)

                if outputFCUData != '':
                        fcuArrayTemp = StringIO.StringIO(outputFCUData).read().splitlines()
                        fcuArrayTemp.pop(0)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                fcuArray = []
                for element in fcuArrayTemp:
                            parts = element.split()
                fcuArray.append(parts)
                print fcuArray
                print fcuArray[3][0]
                exit()
4

1 回答 1

1

更改element.split(' ')element.split()足以删除无关的列。

>>> for element in fcuArrayTemp:
...     print element.split()
...
['101', 'ON', '070F', '070F', 'Low', 'Heat', 'OK', '0']
['102', 'ON', '069F', '069F', 'Low', 'Heat', 'OK', '0']
['103', 'ON', '069F', '069F', 'Low', 'Heat', 'OK', '0']
['104', 'ON', '069F', '070F', 'Low', 'Heat', 'OK', '0']
['105', 'OFF', '072F', '064F', 'High', 'Heat', 'U5', '0']
于 2013-02-26T06:31:24.430 回答