Если вы заглянете в Google за словами writefile зависает , вы найдете ряд обсуждений по этой проблеме. Некоторые из них - переполнение буфера, правильный размер буфера, неисправный COM-порт, очистка состояния при ошибке ... Похоже, есть много вещей, которые можно попробовать.
Еще одна вещь, которую я бы предложил, - это использовать коммуникационную библиотеку вместо прямого вызова API, что-то вроде Async Professional (http://sourceforge.net/projects/tpapro/).. Даже если они добавят некоторые накладные расходы на ваше приложение, они могут упростить вашу работу и избежать количество потенциальных ловушек ...