-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CRC Errors with Holley DTZ541 via RS485 #22
Comments
I think the Holley uses a slightly different CRC-Calculation: So for now the easiest way would be to just ignore the CRC errors or monkeypatch the crc function call. |
Would you be open for a MR that allows disabling the CRC check? |
A quick search brought up this. Can you replace the crc function with this and see if it works as expected? def crc16(data: bytes):
table = [
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
]
crc = 0xFFFF
for byte in data:
crc = (crc << 8) ^ table[(crc >> 8) ^ byte]
crc &= 0xFFFF
return crc I am not sure if disabling the crc check all together is a good idea. My meter sporadically issues corrupt frames which will then result in another runtime exception which can not be caught as easily as the |
This does not seem to work right away. I'll probably need some time to check in detail
Also this error seems to hit me https://github.com/volkszaehler/libsml/pull/76/files#diff-c1f2ae13f8f0c53b6842f00718fd75d67895e04f1bc7aa66857096f1e6cab1bbR41 so I guess I'll need to add this also, even when skipping the CRC checks |
It seems like there is error at times, when the CRC check is not there, catching issues
|
The bitwise and of the crc belongs in the for loop: for byte in data:
crc = (crc << 8) ^ table[(crc >> 8) ^ byte]
crc &= 0xFFFF
return crc Does crc work when you do it like this? |
Sadly that still does not work. Not sure if its the right format, but an example frame looks like this b'v\x04\x00\x00\x01b\x00b\x00re\x00\x00\x01\x01v\x01\x01\x07\x00\x00\nX;\x80\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01\x01cV]\x00v\x04\x00\x00\x02b\x00b\x00re\x00\x00\x07\x01w\x01\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01\x01\xf1\x0ew\x07\x01\x00`2\x01\x01\x01\x01\x01\x01\x04HLY\x01w\x07\x01\x00`\x01\x00\xff\x01\x01\x01\x01\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01w\x07\x01\x00\x01\x08\x00\xffe\x00\x1c\x19\x04e\nX;\x80b\x1eR\xffe\x06o\\8\x01w\x07\x01\x00\x02\x08\x00\xffe\x00\x1c\x19\x04e\nX;\x80b\x1eR\xffe\x08\x1db\xff\x01w\x07\x01\x00\x10\x07\x00\xff\x01\x01b\x1bR\x00S\xf9\xbe\x01w\x07\x01\x00 \x07\x00\xff\x01\x01b#R\xffc\tv\x01w\x07\x01\x004\x07\x00\xff\x01\x01b#R\xffc\tO\x01w\x07\x01\x00H\x07\x00\xff\x01\x01b#R\xffc\tu\x01w\x07\x01\x00\x1f\x07\x00\xff\x01\x01b!R\xfec\x02\xd5\x01w\x07\x01\x003\x07\x00\xff\x01\x01b!R\xfeb"\x01w\x07\x01\x00G\x07\x00\xff\x01\x01b!R\xfeb2\x01w\x07\x01\x00Q\x07\x01\xff\x01\x01b\x08R\x00bx\x01w\x07\x01\x00Q\x07\x02\xff\x01\x01b\x08R\x00b\xf0\x01w\x07\x01\x00Q\x07\x04\xff\x01\x01b\x08R\x00b\xb4\x01w\x07\x01\x00Q\x07\x0f\xff\x01\x01b\x08R\x00b\x0c\x01w\x07\x01\x00Q\x07\x1a\xff\x01\x01b\x08R\x00c\x015\x01w\x07\x01\x00\x0e\x07\x00\xff\x01\x01b,R\xffc\x01\xf4\x01w\x07\x01\x00\x01\x08\x00`\x01\x01b\x1eR\x02b)\x01w\x07\x01\x00\x01\x08\x00a\x01\x01b\x1eR\x02c\x01e\x01w\x07\x01\x00\x01\x08\x00b\x01\x01b\x1eR\x02c\x05\x05\x01w\x07\x01\x00\x01\x08\x00c\x01\x01b\x1eR\x02c`\r\x01w\x07\x01\x00\x01\x08\x00d\x01\x01b\x1eR\x02e\x00\x01\xa5\xb9\x01w\x07\x01\x00\x02\x08\x00`\x01\x01b\x1eR\x02b7\x01w\x07\x01\x00\x02\x08\x00a\x01\x01b\x1eR\x02c\x01X\x01w\x07\x01\x00\x02\x08\x00b\x01\x01b\x1eR\x02c\t\t\x01w\x07\x01\x00\x02\x08\x00c\x01\x01b\x1eR\x02cJ\xec\x01w\x07\x01\x00\x02\x08\x00d\x01\x01b\x1eR\x02e\x00\x02\x13\xcf\x01w\x07\x01\x00\x00\x02\x00\x00\x01\x01\x01\x01\t1.02.007\x01w\x07\x01\x00`Z\x02\x01\x01\x01\x01\x01\x05A01A\x01w\x07\x01\x00`\x05\x00\xff\x01\x01\x01\x01e\x00\x1c\x19\x04\x01\x01\x01c\xb0l\x00v\x04\x00\x00\x03b\x00b\x00re\x00\x00\x02\x01q\x01c\xeb\xf4\x00' |
CRC16 KERMIT using https://github.com/Nicoretti/crc/blob/master/src/crc/_crc.py#L529 for test purposes works fine config = Configuration(
width=16,
polynomial=0x1021,
init_value=0x0000,
final_xor_value=0x0000 ,
reverse_input=True,
reverse_output=True,
) |
def crc16_kermit(data: bytes):
table = [
0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
]
crc = 0x0000 # Initial value for CRC16 KERMIT
for byte in data:
crc = (crc >> 8) ^ table[(crc ^ byte) & 0xFF]
return crc this seems to work also, not sure if I trust it, asked the AI to generate it |
Do you still get errors with the CRC check implemented? |
With the new CRC check implemented things work fine now. There is the occasional corrupt frame, but in general stable |
So do I understand it correctly that no further workaround is needed for you? It's just the modified CRC check? |
Exactly, all I implemented was the CRC16 Kermit, and so far only manually patched in. |
@webratz I've added it to the StreamReader. What do you think? |
Published 1.5 |
Hey,
after having only used the optical interface so far, I tested today a new Meter (Holley DTZ541) and connected it via a RS485 to USB Serial Adapter.
Every single Frame shows an CRC Error, so I initially thought something is completely off. Out of curiousity I cloned the lib and removed the CRC check to see if there is any useful data at all, and it turns out: The values look actually pretty sane.
Sample output of a CRC Error
I'm opening the serial port in exclusive mode, so I'm assuming that there is no other programs accessing it
serial.Serial(self.serial_device, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=5, exclusive=True)
Do you have any hints about how I could go on figuring out the reason for the CRC errors? Might the manufacturer even calculate them different, or is maybe the RS485 Adapater changing something.
The text was updated successfully, but these errors were encountered: