Padu, Your approach of minimizing the time spent in the interrupt routine using circular buffers for the UART interface is a good design principle. If your Main Loop is unable to keep up, then there are two (or perhaps more) fundamental causes. First is what Wouter suggested: the data rate is just too high. The second, is that the time spent operating on the data is too long. I suspect it's the latter since your serial data rate is only 19.2kBaud. If so, the design principle I adhere to is one of splitting large tasks up into smaller tasks. I usually do this with state machines and dispatch tables. For example: MOVLW HIGH(DispatchTable) MOVWF PCLATH RLNCF State,W ;Use the State as an index ANDLW 0xF*2 ;table holds 16 entries ADDLW LOW(DispatchTable) SKPNC ; INCF PCLATH,F ; MOVWF PCL ;branch to the next state. DispatchTable: bra task0 bra task1 bra task2 ... bra task15 Without knowing more about your application, I really can't suggest anything more specific. However, I suspect that it's possible to split your main loop tasks into state machines and then let the main loop call each state machine. Scott _______________________________________________ http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist