I believe the attached patch is moving in the right direction. I remove almost all of the timeout changes. The sleep() is now in the only place where it is required. The data blocks are no longer sent one byte at a time. So is this what you are looking for?
I tried reading and writing both a BTECH UV-25X4 radio (2017) and a BTECH GMRS-50X1 (2019) radio with Windows 10 and Linux Mint 19.3.
Oh man, yeah that's way better right? If that works reliably that's much less complex and contains much less potential for timing related issues, IMHO. Should we try to solicit some people with these radios to load the modification as a module and see if it's stable for all of them?
The only thing I might comment on is the sleep(0.002) after the ident. That's really (really) short and I wonder if it should be just a little longer without causing trouble? Like 0.1 maybe (100ms) or something. I can't imagine the radio requires that kind of turnaround and the 2ms you have is only two character timing units at 9600 baud.
But yeah, awesome, tanks Jim!
--Dan