потом открывается опять порт
А зачем его закрывать и повторно открывать? Всё-таки лучше б вы показали, как именно перевели этот mercury.lib. Приёмник данные считывает хотя бы в это время?
byte_write:=SysComWrite(DeviceNumber, ADR(command), command_len, 0);
IF byte_write=command_len THEN
Так не совсем правильно писать, потому что в буфере порта может не оказаться свободного места для данных в объёме command_len. Нужно суммировать ответы SysComWrite пока они не достигнут command_len, а к адресу своего буфера эту сумму добавлять:
Код:
nbytes_written := nbytes_written + SysComWrite(dev, ADR(command) + nbytes_written, command_len - nbytes_written, 0);
IF nbytes_written = command_len THEN ...