For the error information, is it possible to see a side-by-side comparison of input line and output line? For example, if you send and receive correctly, it might show this:
TX:EF 03 03 00 01 02 0F 07 00 04 00 00 00 00 0F
RX:EF 03 03 00 01 02 0F 07 00 04 00 00 00 00 0F
The reason I ask is that I’m interested in seeing if there is bit shifting going on, or if it is a random drop or corruption (which would indicate different causes).
Would it be practical for you to temporarily try lines of all 0xFF, all 0x00, or all “0x55 0xAA”? These are somewhat easier to see shifts versus corruption if the original lines are not easy to capture.
If you have a protocol analyzer, and the TX/RX can be added side-by-side with the program’s idea of what was sent and received, then this too might help. Any number of the above tests would be of interest, depending on what is practical for you to test.
I haven’t worked much with RS-422, but do you have some sort of adapter close to the UART at both sides of the connection? I am thinking that the built in hardware will have the logical ability to work with this, but not the electrical capabilities with the longer lines and higher speeds. In particular, the UARTs which are integrated are known to need two stop bits at higher data rates (which would be true even with an adapter). Whatever description you can give of the physical wiring and any kind of adapter would be useful.
Also, the UARTs are by default 3.3V TTL level, and so if your RS-422 uses 5V, then success would be hit and miss when directly connecting without level shifting. Level shifting will in turn add jitter and latency, and could get in the way at higher speeds.