Welcome, Philip, to the OEM forum.
Thoughts? This problem is almost inevitable, because each emonTx operates for the most part autonomously.
The first question - or observation - is, the two emonTx’s must be able to hear each other for the transmit hold-off to be able to work. If they can’t, each will believe the band is clear, even when the other is transmitting, and the base will get both simultaneously and that’s something it cannot handle.
You can try adding a delay in the startup code of one, it will alleviate the problem initially, but unless the two emonTx’s run at exactly the same speed forever, then one will catch up with the other and at some stage, you’ll have lost data.
The hold-off of 15 ms should be enough: the data is 40 bytes, and there’s an overhead of 9 bytes, sent at 49.2 kb/s, which I reckon happens in under 8 ms. But feel free to change it and see what happens. There’s a small but real possibility that it won’t work even when both can hear each other, which is because there’s a window while while each is listening and before transmitting - so if both start to listen at exactly the same instant, neither will detect the other listening (of course) and won’t know the other is about to transmit. I haven’t found that in the HopeRF data, so I don’t know how long it listens before deciding the band is clear - or not.
The hold-off doesn’t affect the rate at which the messages are sent, so to spread out the clashes, you could shorten the datalogging period by a mains cycle or two (or more, if you wish). That will mean you’ll lose fewer messages consecutively, but more frequently.
I’m not sure what you mean there - JeeLib isn’t used in that sketch. If you’ve replaced rfm.ino by JeeLib, you’ll have worsened the problem, because JeeLib has no mechanism to detect the band is busy.