Convert Modbus code to use interrupts to populate the TX FIFO. #16
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This change reduces the overall impact of Modbus communication by only waiting for the TX FIFO at the start of the message and then sending the remaining characters from an interrupt handler as the previous characters leave the FIFO.
The drawback is that the interrupt handler may be called during time-sensitive parts of the processing of Ethernet packets. However, in practice, this produces much less impact than using blocking writes - the time wasted waiting for the UART to send the data is much greater than the time it takes to send the characters when there's space in the TX buffer. And the Modbus protocol itself is time sensitive, too - the end of the message is determined by a break in the transmission.
The change has been tested quite extensively using a 2.2kW Fuling inverter. The support for the Weiken inverter (WK600) is still a work in progress. Huanyang inverters should work, but IIRC I haven't tested it after making the changes. There might be some timing nuances that might require further adjustments.