[Tutor] truncated dictionary return
Paul Simon
psimon at sonic.net
Sun Dec 1 23:45:48 CET 2013
"Wolfgang Maier" <wolfgang.maier at biologie.uni-freiburg.de> wrote in message
news:loom.20131201T230651-477 at post.gmane.org...
> richard kappler <richkappler <at> gmail.com> writes:
>
>>
>> I have a script that reads sensor values gathered by an Arduino board
>> from
> serial as a dictionary, said values to later be used in the AI for Nav &
> Control. Here's the script:
>> #!/usr/bin/python
>>
>>
>> def sensorRead():
>> import serial
>> from time import sleep
>>
>> sensors = {}
>> sensors = dict.fromkeys('Sonar1 Sonar2 Sonar3 Sonar4 Dewpoint
> Temperature Humidity Light'.split())
>>
>> arduino = serial.Serial('/dev/ttyACM0', 9600)
>> sleep(1)
>> line = arduino.readline().strip()
>> line = line.lstrip('{').rstrip('}').strip()
>>
>> d = {}
>> for item in line.split(','):
>> item = item.strip()
>> key, value = item.split(':')
>> key = key.strip()
>>
>> value = value.strip()
>> d[key]=int(value)
>> return d
>>
>> The script works great with one exception. I understand the problem, I'm
> just not sure how to address it. The problem is:
>>
>> The Arduino runs on a constant loop, it reads each sensor, sends the key
> and the value to the serial bus in format for python to read it as a
> dictionary, lather, rinse, repeat.
>>
>> Python querries the bus when told. Usually the python script gets the
>> full
> dictionary (all 8 values with keys, brackets etc) but sometimes it
> doesn't.
> Sometimes it only gets the last few values, sometimes it gets nothing or
> misses a bracket and throws an error. This makes sense. They are not in
> sync.
>>
>> What I need to figure out how to do is have the python script wait until
> the next round of values as signified by the opening bracket "{" or check
> that it has all 8 values and if not retry or.... something.
>>
> There should be no sync issue here. The readline method should read from
> the
> serial port until it reaches an EOL character, then return the whole line
> (i.e., your sleep(1) should be removed since readline() already waits for
> input).
> From what you're describing, the real issue seems to be on the side of the
> sender. Are you sure, it terminates each line with \n as it should? Where
> is
> that code coming from?
> Best,
> Wolfgang
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
I also suspect sleep doesn't work. Two better options would be:
1. read/loop until line terminator,
2. Use serial signals, i.e., RTS/DTS if possible.
Paul Simon
More information about the Tutor
mailing list