As an additional thought, I normally use the HSERIN and grab all 8 bytes of the packet, then compare the Slave ID to my own, if it matchs, then check the CRC/LRC and go from there.

Since I'm having to use SERIN2 without the hardware USART, it might be better it I just check for the correct Slave ID in the Wait portion.

I'm not sure it will actually make any difference would it, if there is a 20ms timeout, its still going to sit there for 20ms waiting for the message regardless right? Ah, but I remove the over head of collecting data and checking the Slave ID each time when there is other traffic on the line.

receive:
Gosub GetADCReadings '8 of them
Serin2 stuff here - Timeout goes back to receive (Wait for : and grab all bytes)
If SlaveID doesn't match go back to receive else
Check CRC if Bad go back to receive
Start processing message
Send Reply
goto Receive

Seems to me, if the Serin2 waits for the Slave ID Byte I end up still in the wait for 20ms, but then I immediately exit back to receive, instead of processing every packet on the line, checking ID then going back to receive. Might make a little difference.

Thoughts