
On 1/20/2011 9:42 PM, James Y Knight wrote:
On Jan 20, 2011, at 6:32 AM, Albert Brandl wrote:
The main problem seems to be the specification of Modbus RTU. RTU messages are separated by time gaps that are at least 3.5 characters long. Unfortunately, this is the only reliable way for separating messages - there is no length header or something similar. The specification does define a trailing CRC, though.
I don't think you'll ever be able to do this reliably in Python. At 9600 baud, 3.5 characters is just about 275hz (9600/10/3.5). Linux schedules process at around 500hz. So, unless you use real-time scheduling, I think you have no guarantee that you'll be able to detect such a gap at all -- some other process may be running and you may completely miss it. And you can't reasonably use real-time scheduling in python...
On the other hand, are you sure you need this? http://www.libmodbus.org/ seems to have code which figures out what length packets should be, and no code to detect a 3.5char delay between packets. That seems much more reliable.
It also doesn't seem to have any code to ensure a 3.5char between sent packets, which indicates to me that either it's totally brokem or else that not even the hardware end actually uses a 3.5char delay to determine packet boundaries...I'd guess the second, since even on an embedded CPU, it's much trickier to ensure the appropriate serial port timing than to simply count the correct number of bytes.
Building upon James' reply a little further, I recently did a ModBus RTU implementation on a microcontroller and you need both a 1.5 and 3.5 character timer for correct operation. With the micro, I used hardware timers with uS resolution synchronized to incoming characters via the UART interrupt. As James mentions, user-space Python is simply too far from the hardware to do this sort of thing. You'd probably have to write a custom UART driver and run it on a RTOS to get correct timing. That being said, you can probably write something that will work 99.9% of the time, but may not respond correctly for some weird corner case scenarios. Jason Valenzuela