Avatar billede kristiankogut Nybegynder
18. april 2015 - 11:09 Der er 1 kommentar

Data bliver ikke skrevet til variabel efter en given tidsperiode?

Hej. Jeg har lavet en lille "bareduino" som måler temperatur og lys og som har et par sensore som måler våd/tør analogt. Denne sender data via en radio forbindelse som modtages på min server via seriel data.

Det rå data input ser ud som følgende der kommer ind ca. hver 2. minut. (upræcist pga. manglende real time clock på arduino, da jeg gerne vil spare strøm på afsenderen).

Requesting temperature...DONE
Device 1 (index 0) = 21.56 Degrees C
VCC = 4.36 Volts
VCC = 14.53 %
Light = 1010
Wet1 = 18
Wet2 = 19

Og i python tror jeg at det ser sådan ud:
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 19.69 Degrees C\r\n', 'VCC = 4.34 Volts\r\n', 'VCC = 13.60 %\r\n', 'Light = 1009\r\n', 'Wet1 = 18\r\n', 'Wet2 = 19\r\n']

Mit script fejer ikke, men efter en given tid bliver alle variabler ikke skrevet og jeg ved ikke hvorfor:

Når scriptet kører uden problemer får jeg følgende:

Welcome to remote bareduino temprature! Waiting for data...
['\r\n']
['\r\n', 'Requesting temperature...DONE\r\n']
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n']
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n', 'VCC = 4.36 Volts\r\n']
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n', 'VCC = 4.36 Volts\r\n', 'VCC = 14.53 %\r\n']
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n', 'VCC = 4.36 Volts\r\n', 'VCC = 14.53 %\r\n', 'Light = 1011\r\n']
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n', 'VCC = 4.36 Volts\r\n', 'VCC = 14.53 %\r\n', 'Light = 1011\r\n', 'Wet1 = 18\r\n']
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n', 'VCC = 4.36 Volts\r\n', 'VCC = 14.53 %\r\n', 'Light = 1011\r\n', 'Wet1 = 18\r\n', 'Wet2 = 19\r\n']
print data
['\r\n', 'Requesting temperature...DONE\r\n', 'Device 1 (index 0) = 23.37 Degrees C\r\n', 'VCC = 4.36 Volts\r\n', 'VCC = 14.53 %\r\n', 'Light = 1011\r\n', 'Wet1 = 18\r\n', 'Wet2 = 19\r\n']
23.37 4.36 14.53 
23.37 °
4.36 ⚡
� 14.53 %
light
wet1
wet2

~ $ cat /var/python/rx4.py

#!/usr/bin/python
# -*- coding: iso-8859-9 -*-
#
# rx4.py serial_port port_speed
#
import serial, sys
import re
import time
import datetime
import pymysql
#if (len(sys.argv) != 3):
#  print "command line: rx.py serial_port port_speed"
#  sys.exit()
port = '/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0'
speed = 9600

ser = serial.Serial(port,speed)
ser.setDTR()
# flushing seriel, hvis der evt. måtte være noget i bufferen
ser.flushInput()

#print commandline start
print 'Welcome to remote bareduino temprature! Waiting for data...'

#Denne while er for at loope hele scriptet uendeligt
while 1:
  count = 0
  data = []
#data opsamling, while bliver ved til den har fået 5 linjer
  while (count < 8):
    count += 1
    x = ser.readline()
    data.append(x) # data bliver tillagt listens ende med ny data (x)
    print data
#søge efter indholdrt i data for at finde værdier

  match = re.search(' = (.*?) Degrees C', data[2])
  if match is not None:
    temperatur = match.group(1)
  match = re.search('VCC = (.*?) Volts', data[3])
  if match is not None:
    volts = match.group(1)
  match = re.search('VCC = (.*?) \%', data[4])
  if match is not None:
    batt = match.group(1) 
  match = re.search('Light = (.*?)', data[5])
  if match is not None:
    light = match.group(1)
  match = re.search('Wet1 = (.*?)', data[6])
  if match is not None:
    wet1 = match.group(1)
  match = re.search('Wet2 =(.*?)', data[7])
  if match is not None:
    wet2 = match.group(1)

  print 'print data'
  print data
  print (temperatur + " " + volts + " " + batt + " " + light + " " + wet1 + " " + wet2)
#log til db
  conn = pymysql.connect(host='10.0.0.175', port=3306, user='python', passwd='testkode', db='test2')
  cur = conn.cursor()
  cur.execute("INSERT INTO 28b65eb2(celsius,voltproc,volt,light,wet1,wet2) VALUES (%s,%s,%s,%s,%s,%s)", (temperatur, batt, volts, light, wet1, wet2))
  conn.commit()
  cur.close
  conn.close()
#print til terminal
  print temperatur, u'\u00b0'
  print volts, u'\u26A1'
  print u"\U0001F50B", batt, u"\u0025"
  print "light", light
  print "wet1", wet1
  print "wet2", wet2

  temperatur = ""
  batt = ""
  volts = "" 
  data = []
  ser.flushInput()


Desuden ved jeg ikke hvorfor mit script ikke skriver variablerne til "light, wet1 og wet2"
Avatar billede jakobdo Ekspert
08. juni 2016 - 11:11 #1
Kunne du evt. overveje at pakke din kode ind i noget try/except ?
Så vil du i første omgang kunne se om der er noget der fejler.

Og evt. tilføje:

import sys
import traceback

try:
  # DIN KODE
except:
  print '*' * 20
  traceback.print_exc(file=sys.stdout)
  print '*' * 20
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester