communication error

I'm using arduino connected to a PC via USB (with a windows driver that makes it look like to the OS it's a serial COM connection)

what happens if I do a Serial.print("hello") on Arduino and, for some reason, one bit get corrupted or missed? does the protocol fix itself (ie, error correction, requesting resend, something like TCP)?

can I safely assume everything that Arduino sends will be correctly received in my PC?

for instance (an example just to make sure), if I inserted noise in the communication somehow (a longer than standard cable, another eletrocmagnetic field, doesn't matter), the worst that would happen would be a reduction in the throughput (since it would be needing to correct/resend more often)?

or is there a risk that I send "abcde" and read "bcd"?

and finally... which are the "bounds" of reading? doing:

Serial.print("a");
Serial.print("b");

is different from:

Serial.print("ab");

?

thanks!

what happens if I do a Serial.print("hello") on Arduino and, for some reason, one bit get corrupted or missed? does the protocol fix itself (ie, error correction, requesting resend, something like TCP)?

Nope. It's up to you to manage that. After all the communication is asynchronous - no acknowledgments are requested/sent.

can I safely assume everything that Arduino sends will be correctly received in my PC?

Nope.

for instance (an example just to make sure), if I inserted noise in the communication somehow (a longer than standard cable, another eletrocmagnetic field, doesn't matter), the worst that would happen would be a reduction in the throughput (since it would be needing to correct/resend more often)?

The worst that would happen is that more data would be lost.

or is there a risk that I send "abcde" and read "bcd"?

Yes.

Sending "a" and "b" separately or together makes no difference.

Nope. It's up to you to manage that. After all the communication is asynchronous - no acknowledgments are requested/sent.

do you know if a missing bit will break at most 1 byte, or anything that comes after that?

for instance, let's say I would like to send: 11111111 00000000 11111111 00000000

and the second bit is lost... I would then receive: 11111110 00000001 11111110 0000000

and ALL bytes after that would be "corrupted"?

if so, it seems that creating a reliable communication is pretty complex... at least a division in packets with seq and ack would be needed

It is quite unlikely that a bit would be lost in the sense that only 7 bits would be shifted out by the UART when 8 should have been. But if that happened, yes, a sequence of subsequent words would be mangled too.

What is more likely is that noise might change one bit. In this instance that bit is mangled, but the timing of the word is still okay and subsequent words are not affected.

Another effect you might see is where some noise occurs that looks to the receiver like a start bit. This too can throw off the timing of subsequent words.

Asynchronous serial communications is not too complicated and there is a lot of information around. This is nothing remotely unique to Arduino and you should look at sources like http://www.google.com/#q=asynchronous+serial+communication

Another affect [sic] you might see is where some noise occurs that looks to the receiver like a start bit

A UART normally detects the leading edge of a start bit and then delays half a bit period and samples again. If the state is the same, the start bit is taken as valid, and data sampling is timed from the middle of the start bit. If the line state is not the same as the transition, the UART continues looking for another transition. If line noise lasts as long as a half bit period, then it's time to reconsider your line and bit rate.