Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Данные с com порта |
Автор: Alexey68 6.11.2016, 19:37 | ||
Здравствуйте All! При чтении с ком порта к байту впереди добавляются "лишние" байты FFFFFF, из-за чего это происходит?
Пример ответа: 90 FFFFFF43 76 FFFFFF32 88 FFFFFF29 Причём ответ с порта правильный, если бы не добавляемые FFFFFF. Прошу Вашей помощи. |
Автор: GremlinProg 7.11.2016, 10:38 | ||
скорее всего, это происходит из-за "дополнения до единицы" можно проверить:
так ни чего лишнего не выводит? |
Автор: Alexey68 8.11.2016, 13:45 | ||||
GremlinProg, Да, всё в порядке. Благодарю, у меня ещё вопрос: Правилен ли следующий код:
при передаче массива байт например:
|
Автор: feodorv 8.11.2016, 18:25 |
Если Вы планируете использовать функцию strlen (вместо простой и внятной передачи длины сообщения в качестве параметра функции Write_Com_3), то Вы обязаны завершить передаваемый этой функции буфер символом '\0' (и это ещё не говоря о возможности встретить нулевой символ в актуальных данных буфера). Ни command1, ни command2 не завершены нулём. Код не правилен. Вот совершенно не понятна длина массива. Ничто не предвещает единицы ![]() Зачем второй strlen, если есть результат первого, да ещё и сохраненный в переменную? Почему результат выполнения WriteFile, содержащийся в этой переменной, не проверен? Возможна же неполная передача данных буфера. |
Автор: xvr 10.11.2016, 18:11 |
Это вам понятно, а функции strlen - непонятно. Она ищет в поданном массиве 0, где нашла, там и конец строки. В вашем массиве никаких 0 нет, так что где именно она его найдет (где то в памяти после массива) - неизвестно |
Автор: Alexey68 10.11.2016, 21:47 |
если я добавлю 0, то принимающая сторона не поймёт команду (пробовал) Write_Com_3(command2+'\0'); |
Автор: feodorv 10.11.2016, 22:56 | ||||
Мы говорим о разных нулях. Я и xvr - о нуле, завершающим строчку:Тогда strlen(command2) вернет 6 (Вы ведь этого хотите, я никак не могу понять, или не этого?) И завершающий строчу ноль не будет передан по сети в качестве данных, портя команду. Но загадкой для меня остаётся использование strlen вообще, и для бинарных данных в частности. Так почему не так:
|
Автор: xvr 11.11.2016, 11:41 |
Если вы думете, что эта конструкция добавит ноль в конец вашей строки, то вы сильно ошибаетесь. Смотрите арифметику указателей в языке С |