But if it is my timer that creates new threads after the old one have ended (return 0), won't killing that timer stop further threads from being created?
How do you know when the old thread has ended? - there's nothing in the posted code that determines this. Killing the timer will stop new threads being created but this doesn't terminate existing threads. Possibly the 'hang' is caused because on stop you close the serial port handle from which existing threads are still trying to read?