2

I'm working with an SDS011 particular sensor through its serial interface. The spec sheet (http://inovafitness.com/upload/file/20150311/14261262164716.pdf) indicates that the second to last byte of a serial packet is a checksum equal to sum of all the data bytes.

I am using pyserial to read and interpret the serial data. Here's a snippet of the code:

import serial
def read_sensor(port):
 while True:
 header = port.read(2)
 if header == b'\xAA\xC0':
 data = port.read(6)
 checksum = port.read()
 tail = port.read()
 if tail == b'\xAB':
 return header + data + checksum + tail
port = serial.Serial(port=MY_PORT)
packet = read_sensor(port)
data_sum = sum(packet[2:8])
checksum = packet[8]
if data_sum == checksum:
 print('Ok')
else:
 print('Error')

However, I haven't got a single packet whose checksum hasn't been an error. Is there anything I could be potentially doing wrong?

asked Apr 16, 2016 at 0:28

2 Answers 2

1

Generally, a checksum byte is computed using 8-bit arithmetic, with overflow ignored.

The Python sum function uses arithmetic of indefinite precision (eg, 32- or 64-bit words for small values, with additional words for larger numbers).

Try comparing checksum to data_sum % 256. If that doesn't fix the problem, print out some of the data packets and checksum values so that you can use a calculator to test different combinations.

answered Apr 16, 2016 at 1:47
1
  • data_sum % 256 fixed it. I thought it was strange that data_sum values were greater than a byte. Should've just checked the first byte! Commented Apr 16, 2016 at 3:31
0

I assume MY_PORT stands for COMxx. Since you set no timeout, it means port.read() will block till it gets the number of bytes requested. I suggest you add a print() to display the bytes returned, if any.

To get the sum, use data_sum = sum(packet[2:8]) & 0xff to ensure you only get a byte. Also add port.reset_input_buffer() right before you call read_sensor(), to flush the input buffer.

It would also be a good idea to take at least 3 consecutive readings from the sensor in case of any errors in the first reading right after opening the port. Dont forget to add a port.close() at the end of your code.

answered Apr 16, 2016 at 1:57

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.