Drmn4ea:
A question for the experts
That probably excludes me but I'll give it a go.
I've read at least one mention (actually, in the avr-gcc FAQ of all places) that the internal RC oscillator in specific/some/all ATmegas is not reliable enough for timing-critical tasks, including transmitting via RS232.
That is not exactly what was stated but I'll play along.
is the RC oscillator on commonly Arduino-ized ATmegas (168/328, 644, 1284) as bad as it's made out to be for RS232 communication?
Maybe. For reliable serial communications, the clock needs to be better than about ±4.5%. From the factory, the oscillator is guaranteed to be ±10%. In my very limited testing, 5 out of 6 processors fresh from the factory had clocks good enough for serial communications. I was able to use them without any tuning.
The datasheet claims the RC oscillator can be "very accurately"
The claims is ±1% which is more than good enough for serial communications.
calibrated via the user OSCCAL register for a given voltage and temperature range ... but is this value stable over time?
Yes. Well, I've never seen any mention of the oscillator wearing over time.
In my experience, the oscillator has a moderate dependence on voltage and a low dependence on temperature (around room temperature). If the two are stable, I can consistently tune the oscillator to about ±0.25%. I suspect Atmel's number (±1%) is over the entire temperature / voltage range (or at least a big part of that range). In your case, once you've tuned the oscillator, you should have no problems with serial communications. Try to tune at the middle temperature (and do some testing at the extremes).
Bear these things in mind...
[#] EACH PROCESSOR IS UNIQUE. You cannot tune one and expect the OSCCAL value to work on another.
[#] When more current is flowing through the processor (lots of HIGH OUTPUTs), the processor will warm a bit which changes the oscillator speed. In my experience, this has a minor effect on the tuning but you should perform your own testing.
[#] Atmel's tuning algorithm places the OSCCAL value in EEPROM address zero. I suggest doing something similar. In my case, I store a "magic value" (addresses zero and one) and a version number (address three) so the Sketch can tell if a tuning value is available.
This can be used to tune the oscillator...
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1287558192
It's packaged for three ATtiny processors but it can easily be modified to work with other processors.