Всё гораздо проще. Стринги в языке C по определению заканчиваются нулем, который сам за символ не считается (нуль-терминированная строка). Отсюда следует очевидное следствие - строка символов не может содержать нуля, а буде такой в строку ставлен, то это привело бы лишь к тому, что строка стала бы короче, будучи обрезанной по первому же встреченному нулю.
То же касается функции strlen(), определяющей длину стринга. Она возвращает не число сиволов, которые вы туда понатыкали, а число ненулевых символов, начиная с нуля. Поэтому конструкция:
WriteFile(COMport, bufwr, strlen(bufwr), &temp, &overlappedwr);
так же оказывается завязана на функцию strlen(), поскольку именно она вычисляет число передаваемых байт. Отсюда и ваша ошибка.
Исправлять положение следует явным указанием числа передаваемых байт. Элегантным способом реализации которого может быть вариант создания специальной функции, помещающей байт в буфер, вместо механического копирования. Такая функция добавляла бы байт, одновременно инкрементируя счетчик. Этот же счетчик впоследствии использовался бы при сбросе буфера на вывод, после которого счетчик обнулялся.
Например так:
Код
// глобальные переменные:
char bufwr[1024];
int counter = 0;
void PushBuffer( char symbol)
{
bufwr[counter++] = symbol;
}
При желании эту функцию можно объявить inline, тем самым превратив ее в прямую подстановку. А обнуление counter вставить в WriteThread() после успешного завершения передачи. А саму передачу производить так:
WriteFile(COMport, bufwr, counter, &temp, &overlappedwr);
Соответственно этому, пихать байты в буфер следует не так:
for(unsigned char icd=0;icd<10;icd++){bufwr[icd]=comand[icd];
а вот так:
for(unsigned char icd=0;icd<10;icd++) PushBuffer(comand[icd]);