is there a problem on this simple code
jrlen balane
nbbalane at gmail.com
Tue Mar 15 19:33:23 EST 2005
ok heres the code, i'm trying on IDLE:
import sys
import serial
import sys, os
import serial
import string
import time
from struct import *
data_file = open('C:/Documents and Settings/nyer/Desktop/IRRADIANCE.txt', 'r')
data = data_file.readlines()
def process(list_of_lines):
data_points = []
for line in list_of_lines:
data_points.append(int(line))
return data_points
irradiance = process(data)
ser = serial.Serial()
ser.baudrate = 9600
ser.port = 0
ser
ser.open()
tx_command = 67
tx_no_databyte = 2
tx_message_no = 1
tx_len = len (irradiance)
for j in range (tx_len) :
start_time = time.time()
temp1 = []
temp2 = []
pyra1 = []
pyra2 = []
voltage = []
current = []
current_time = time.time()
while( current_time >= start_time + 300):
data_hi, data_lo = divmod(irradiance[j], 0x100)
tx_checksum = -(data_hi + data_lo + tx_command + tx_message_no
+ tx_no_databyte) & 0xff
ser.write(pack('6B', tx_command, tx_message_no,
tx_no_databyte, data_lo, data_hi, tx_checksum))
rx_data = ser.read(19)
rx_len = len(rx_data)
byte = [ord(x) for x in rx_data]
if rx_len < 10:
#print 'it is not pumping data out as fast as we assumed'
sys.exit(1)
for k in range (rx_len-9):
if byte[k] == 70 and byte [k+2] == 6 and sum(byte[k:k+10])
& 0xff == 0:
#print byte[k:k+10]
temp1.append(byte[k+3])
temp2.append(byte[k+4])
pyra1.append(byte[k+5])
pyra2.append(byte[k+6])
voltage.append(byte[k+7])
current.append(byte[k+8])
print temp1, temp2, pyra1, pyra2, voltage, current
current_time = time.time()
while theres no error in the output, there is also no response from
the hardware or maybe communication is off.
could somebody out there help me.
by the way, here is a working code: though here the data to be
transmitted is just incrementing and not read from a text file:
import serial
import string
import time
from struct import *
import os
ser = serial.Serial()
ser.baudrate = 9600
ser.port = 0
ser.timeout = 1
ser
ser.open()
tx_command = 67
tx_message_no = 1
tx_no_databyte = 2
item=10000
for item in range(10000, 30001, 10):
data_hi, data_lo = divmod(item, 0x100)
tx_checksum = -(data_hi + data_lo + tx_command + tx_message_no +
tx_no_databyte) & 0xff
ser.write(pack('6B', tx_command, tx_message_no, tx_no_databyte,
data_lo, data_hi, tx_checksum))
#print tx_command, tx_message_no, tx_total_data, data_lo, data_hi,
tx_checksum
rx_data = ser.read(19)
rx_len = len(rx_data)
#print 'rx_len', rx_len
byte = [ord(x) for x in rx_data]
#print 'received', byte
if rx_len < 10:
print 'it is not pumping data out as fast as we assumed'
sys.exit(1)
for k in range (rx_len-9):
if byte[k] == 70 and byte [k+2] == 6 and sum(byte[k:k+10]) & 0xff == 0:
print byte[k:k+10]
===================================
outputs:
[70, 2, 6, 54, 197, 253, 230, 231, 211, 26]
[70, 3, 6, 54, 197, 253, 230, 231, 211, 25]
[70, 3, 6, 54, 197, 253, 230, 231, 210, 26]
[70, 3, 6, 54, 197, 253, 230, 231, 210, 26]
[70, 3, 6, 54, 197, 253, 230, 231, 211, 25]
[70, 3, 6, 54, 197, 253, 230, 231, 210, 26]
[70, 3, 6, 54, 197, 253, 230, 231, 211, 25]
[70, 3, 6, 54, 197, 253, 230, 231, 210, 26]
[70, 3, 6, 54, 197, 253, 230, 231, 211, 25]
...
...
On Wed, 16 Mar 2005 07:34:44 +0800, jrlen balane <nbbalane at gmail.com> wrote:
> will this be correct???
> what i want to happen is saved every received data (6 data bytes) to
> an array for each one.
>
> for k in range (rx_len-9):
> if byte[k] == 70 and byte [k+2] == 6 and sum(byte[k:k+10]) & 0xff == 0:
> #print byte[k:k+10]
>
> temp1.append(byte[k+3])
> temp2.append(byte[k+4])
> pyra1.append(byte[k+5])
> pyra2.append(byte[k+6])
> voltage.append(byte[k+7])
> current.append(byte[k+8])
>
> if time.sleep(300) == True:
> temp1 = []
> temp2 = []
> pyra1 = []
> pyra2 = []
> voltage = []
> current = []
>
> and after x minutes of of receiving data, the arrays will be emptied
> of its contents.
>
> thanks again for the help.
> On 15 Mar 2005 02:13:40 -0800, John Machin <sjmachin at lexicon.net> wrote:
> >
> > jrlen balane wrote:
> > > did some editing:
> > >
> >
> > The error means that you received less than 19 bytes of data.
> >
> > > rx_data = ser.read(19)
> > !rx_len = len(rx_data)
> > !print 'rx_len', rx_len
> > > byte[0:18] = unpack('19B', rx_data)
> > !# trash the above, do this
> > !byte = [ord(x) for x in rx_data]
> > !print 'received', byte
> > !if rx_len < 10:
> > ! print 'it is not pumping data out as fast as we assumed!'
> > ! sys.exit(1)
> > >
> > !for k in range(rx_len - 9):
> > > if byte[k] == 70:
> > > if byte[k+2] == 6:
> > > if byte[k+9] ==
> > >
> > -(byte[k]+byte[k+1]+byte[k+2]+byte[k+3]+byte[k+4]+byte[k+5]+byte[k+6]+byte[k+7]+byte[k+8])
> > > & 0xff:
> >
> > Yuk!
> >
> > (1) use 'and'
> > (2) when you find yourself typing repetitive crap like that, your brain
> > should be shrieking "There must be a better way!!"
> >
> > if byte[k] == 70 \
> > and byte[k+2] == 6 \
> > and sum(byte[k:k+10]) & 0xff == 0:
> >
> > > print byte[k:k+9] <<<<<<=== you probably mean 10,
> > not nine
> > > ====================================
> > > heres the error:
> > > Traceback (most recent call last):
> > > File "C:\Python23\practices\serialnewesttest2.py", line 28, in
> > -toplevel-
> > > byte[0:18] = unpack('19B', rx_data)
> > > error: unpack str size does not match format
> > >
> > > what i am doing here is creating an array from based on the unpacked
> > data
> > > then i am searching for the array member that is equal to "70" since
> > > it is going to be my reference. once i find it, i'll based my
> > received
> > > data from that point. then if the succeding tests are confirmed, i
> > can
> > > get my data.
> > >
> > > please help....(again) :(
> >
> > --
> > http://mail.python.org/mailman/listinfo/python-list
> >
>
More information about the Python-list
mailing list