2014-09-22 65 views
-1

我正在使用python 2.7 。 我从UART获取串行数据。使用python将数组值存储在文本文件中

我试图保存串行数据值以及数据收到时的实时。

从UART接收

数据的形式为:

2.1862745098X 2.42156862745X 2.42156862745X 0.401960784314X 0.0X 0.637254901961X 1.49019607843X ............等等等等

我正在与时间一起使用下面的代码保存的值:我面临

f1 = open('accelerometer sensor1.txt','w') 
while 1: 
# Read from serial port, blocking 
data =ser.read(1) 
data1=(data) 


# If there is more than 1 byte, read the rest 
n = ser.inWaiting() 
data1 = (data1 + ser.read(n)) 
l = data1.split() 

#t1 = datetime.datetime.now() 



x = [d.strip("X") for d in l if d[len(d)-1] == "X"] 
for i in range(0,len(x)): 
    f1.write(str(datetime.datetime.now())) 
    f1.write("\t") 
    f1.write(str(x[i])) 
    f1.write("\n") 

问题是我在特定时间接收大数目的值。所以,当我保存数据,它的形式是:

2014-09-22 11:30:40.980000 2.1862745098 
2014-09-22 11:30:40.980000 2.42156862745 
2014-09-22 11:30:40.980000 1.71568627451 
2014-09-22 11:30:40.980000 0.401960784314 
2014-09-22 11:30:40.980000 0.0 
2014-09-22 11:30:40.980000 0.637254901961 
2014-09-22 11:30:40.980000 1.49019607843 
2014-09-22 11:30:40.980000 2.42156862745 
2014-09-22 11:30:40.980000 2.5 
2014-09-22 11:30:40.980000 1.58823529412 
2014-09-22 11:30:40.980000 0.78431372549 
2014-09-22 11:30:40.980000 0.0 
2014-09-22 11:30:40.980000 0.196078431373 
2014-09-22 11:30:40.980000 1.17647058824 
2014-09-22 11:30:40.980000 1.74509803922 
2014-09-22 11:30:40.980000 2.49019607843 
2014-09-22 11:30:40.980000 2.44117647059 
2014-09-22 11:30:40.980000 1.33333333333 
2014-09-22 11:30:40.980000 0.558823529412 
2014-09-22 11:30:40.980000 0.0 
2014-09-22 11:30:40.980000 0.205882352941 
2014-09-22 11:30:40.980000 1.43137254902 
2014-09-22 11:30:40.980000 2.08823529412 

我不想以这种形式,我想收到的每个样本的实时宁可实时的收到一组样本点。

我想文本文件显示是这样的:

2014-09-22 11:30:40.980000 2.1862745098 
2014-09-22 11:30:40.980010 2.42156862745 
2014-09-22 11:30:40.980020 1.71568627451 
2014-09-22 11:30:40.980030 0.401960784314 
2014-09-22 11:30:40.980040 0.0 

我该怎么办呢?请提出一些建议。

Thanks`

编辑

我想每个采样点有不同的时间戳。这应该是可能的,因为每个采样点都是单独通过串行端口而不是组中的。我认为如何阅读这些样本点可能存在问题,如果我能够以某种方式单独阅读它们,那么我的目的就会得到解决。

我试着单独获取每个采样点。我能够这样做,但代码变得非常慢。 我只是做了

data =ser.readline(5) 
    data1=(data) 

价值观通过UART来是类型: 127X 154X 100X 158X 0X 20X .............

有没有办法阅读价值单独和也不会影响速度。

+0

你知道你想要的格式吗?如果是这样,请添加它。如果不是,请描述更多你的需求。你似乎不需要有历史数据,对吗? – mrcrgl 2014-09-22 09:09:36

+0

请再次检查问题。我添加了所需的格式。 – yuvraj 2014-09-22 09:20:45

回答

0

我想你想有一个时间戳内的数字的平均值。请查看此代码,它汇总了给定的值,并且 - 如果时间戳不同 - 将其写入文件。

缓存变量应该在循环;-)

cache = ('', 0, 0.0) 

def aggregate(value): 
    now = str(datetime.datetime.now()) 

    c_date, c_count, c_avg = cache 
    if now != c_date: 
     # write c_avg and c_date to file 
     f1.write(c_date) 
     f1.write("\t") 
     f1.write(str(c_avg)) 
     f1.write("\n") 

     # after that, clear c_count and c_avg 
     c_count = 0 
     c_avg = 0.0 

    if c_count is 0: 
     c_count = 1 
     c_avg = float(value) 
    else: 
     c_avg = ((c_avg * c_count) + float(value))/(c_count + 1) 
     c_count += 1 

    cache = (now, c_count, c_avg) 


for i in range(0,len(x)): 
    aggregate(x[i]) 

我希望这填补你的需求之外进行初始化。

Cheers

+0

这个答案不符合我的需要。我不想取平均的样本点数。我希望每个样本点具有不同的时间戳,而不需要考虑它们的平均值。这应该是可能的,因为每个采样点都是单独通过串行端口而不是组中的。我认为如何阅读这些样本点可能存在问题,如果我可以单独阅读它们,那么我的目的将被解决,但现在我无法做到这一点。 – yuvraj 2014-09-23 04:15:59

+0

你在开玩笑吗?你不能告诉这个吗?我对你的环境毫无头绪。这不是我的工作,我只是想帮忙。自己尝试,我出去了。 – mrcrgl 2014-09-23 07:22:40

+0

对不起,我的意思不是粗鲁..... – yuvraj 2014-09-23 07:26:21

相关问题