The timer will be dependent on the event loop running. Are you blocking it somehwere? Where is your code executing if it is not transiting serial_receive?
Why do you use a timer to call serial_receive() rather than just reacting when a serial port tells you that it has data?