Ähm...
wieso tut ihr euch das überhaupt an!?

Pointerarithmetik ist ja schön und gut, aber in 99% aller Fälle geht es auch sehr viel bequemer:

Code:
void uart_send(void* data, uint16_t size)
{
   uint16_t n;
   uint8_t* data8 = (uint8_t*)data;

   for(n=0; n<size; n++)
      uart_putc(data8[n]);
}

oder alternativ:

void uart_send(void* data, uint16_t size)
{
   uint16_t n;

   for(n=0; n<size; n++)
      uart_putc(((uint8_t*)data)[n]);
}
Ja, es ist eine Zählvariable dazugekommen, aber dafür ist der Code leichter lesbar und weniger fehleranfällig.
(Außerdem wird n niemals im Speicher existieren, der Compiler verwendet einfach ein Register dafür)