Ком-порт это очень древняя вещь, но она не умрёт никогда, потому что когда нужен простой способ обмена данными -- выбор очевиден. А ещё есть виртуальный ком-порт, через который работает множество устройств. Преобразуется он потом в реальные интерфейсы серии RS-*/UART или что там ещё с ним происходит -- не имеет значения.
У ком-порта есть настройки. Если настройки на обоих концах не совпадают, то обмена данными у нас не будет. Основные настройки это скорость, число битов в байте, проверка чётности и количество стоповых битов. Что всё это означает на практике знать не нужно, надо чтобы было совпадение настроек с обоих концов. Вы можете поменять эти настройки в диспетчере устройств Windows, но это настройки по умолчанию. При запуске программы она, конечно же, должна брать нужные для работы настройки, а не умолчальные. Для этого есть функция SetCommState. Поскольку настроек у ком-порта много, она использует структуру типа DCB.
Из четырёх настроек, что я привёл выше, три используются в структуре напрямую в тех же единицах измерения. То есть, если скорость обмена 115200, то в поле BaudRate надо писать просто 115200. Если в байте шесть бит, то в поле ByteSize надо писать число шесть.
Но с числом стоповых битов дела обстоят не так. Протоколы обмена для ком-порта предусматривают три допустимых значения для числа стоповых битов: один, полтора (!) и два. Поле StopBits имеет тип BYTE. Это тип винапи, который эквивалентен unsigned char, то есть целый, беззнаковый, восьмибитный. Как же в нём сделано значение полтора? Наверное, там специальная константа.
Да, она специальная, но не только у значения полтора, но и у двух остальных.
Одному стоповому биту соответствует число... ноль. Полутора -- один. И только двум соответствует два. С одной стороны это логично -- 1, 1.5 и 2 должны быть последовательным значениями. Но с другой -- нелогично. Один стоповый бит -- это самая частая конфигурация. Но если по инерции написать .StopBits=1, то получишь шиш, а потом будешь долго разбираться, в чём причина, почему устройство не отвечает.