Anyone actually had any practical experience with Arduino serial comms using the internal oscillator?
I haven't actually tried using the internal oscillator, but the Arduino does provide support for the internal clock for atmega168 and 328 chips.
If you have a chip with a working bootloader, you will need to replace the bootloader, change the fuse settings for internal clock use, and let Arduino know the new clock speed.
Here how it is done. You need to add a new boards.txt entry. This can be done in two places - adding it to the boards.txt file in hardware/arduino in the Arduino program folder, or adding it to a "hardware\arduino" folder in your sketchbook folder (not your sketch folder - that is a different thing). You find out where the sketchbook folder is by running Arduino and going to Files->preferences. If there is a boards.txt file in hardware/arduino in the sketchbook folder, it will use that and totally ignore the one in Arduino program folder. If you add it to Arduino program folder, the added board may get lost in a future update. Don't like either option. Ideally, they should allow a hardware/arduino folder in the sketch folder, but they don't.
I would probably add the single entry boards.txt file to my sketchbook, with another copy plus a readme.txt file with instructions in the sketch folder. When you finish this job, delete the entry from the sketchbook folder, so it does not mess up the next arduino project. If all the above sounds confusing, just do it, and you will see what the problem is.
Anyway if you are using a atmega328 chip, you need a boards.txt file containing this in one of the two locations:
##############################################################
atmega328ic.name=ATmega328 8 MHz internal clock
atmega328ic.upload.protocol=stk500
atmega328ic.upload.maximum_size=30720
atmega328ic.upload.speed=57600
atmega328ic.bootloader.low_fuses=0xE2
atmega328ic.bootloader.high_fuses=0xDA
atmega328ic.bootloader.extended_fuses=0x05
atmega328ic.bootloader.path=arduino:atmega
atmega328ic.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328ic.bootloader.unlock_bits=0x3F
atmega328ic.bootloader.lock_bits=0x0F
atmega328ic.build.mcu=atmega328p
atmega328ic.build.f_cpu=8000000L
atmega328ic.build.core=arduino:arduino
The "low_fuses" setting enables the internal clock, and the f_cpu setting sets 8MHz. The bootloader has been changed to "ATmegaBOOT_168_atmega328_pro_8MHz.hex" which is already in the hardware folder in the Arduino program folder. Everything else is the same as a standard 16MHz external clock Arduino.
Then you run Arduino with the target connected.
Go to tools->board and select "ATmega328 8 MHz internal clock"
Go to tools->programmer and select "Arduino as ISP"
Go to tools->burn_bootloader
You now should be ready to go. The chip now has the new bootloader, and the Arduino has the new settings for the internal 8MHz clock atmega328.
BoredAtWork is correct - the chip comes from the factory calibrated to 10% according to the data sheet. I do not know why it is so bad - it sounds like a very conservative figure to me as if they go to the trouble of calibrating it at the factory, I am sure they would calibrate it to 1% at the time. If it is within 5%, then the serial comms will probably work. I do not have experience, but the Arduino does go to the effort of providing the bootloader, so it might work OK.
Richard.
Edit: I left out one important fact. The "Arduino as ISP" option uses an Arduino board to program the bootloader onto a second board or device. Here is a tutorial describing it:
http://arduino.cc/en/Tutorial/ArduinoISP