![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#31 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
Чего тут непонятного - поищите в документации CString описание метода Format...
|
![]() |
![]() |
![]() |
#32 |
Пользователь
Регистрация: 05.01.2012
Сообщений: 27
|
![]()
Может быть глупый, но тем не менее вопрос:
В исходнике программы для записи используется функция Код:
Но та же функция strlen игнорирует нулевые байты. А они мне нужны. Можно, конечно, задать фиксированный объем передаваемых байт. Но в этом случае незаполненные ячейки будут передаваться нулями (лишние нули). Как тогда лучше поступить? Чем заменить strlen? |
![]() |
![]() |
![]() |
#33 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
Ну вы же както добавляете эти нули - ведите учет сколько данных в буфере и просто ставьте размер буфера. Тем более, что явно у вас двоичный протокол, значит где-то должен быть отправлен размер, чтоб принимающая сторона смогла собрать данные правильно.
|
![]() |
![]() |
![]() |
#34 |
Пользователь
Регистрация: 05.01.2012
Сообщений: 27
|
![]()
Со своей колокольни я понимаю процесс так:
Идет непрерывный поток чтения из порта и записи в файл. Буфер заполняется меньше, чем на 100 %. Если я запишу Код:
Функция strlen позволяла определить фактическое число байт. Однако она игнорирует байты 0х00. Если от нее отказаться, то как еще можно проконтролировать фактическое число байт в буфере? Использовать comstat.cbInQue? |
![]() |
![]() |
![]() |
#35 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
Кто-то же заполняет буфер. Этот ктото вполне может записывать сколько в буфере данных в переменную. При отправлении воспользуйтесь этой переменной. И не обязательно заполнять буффер на 100%, главное знать на сколько он заполнен.
|
![]() |
![]() |
![]() |
#36 |
Пользователь
Регистрация: 05.01.2012
Сообщений: 27
|
![]()
Нули в буфер, который по сути является массивом элементов типа char, записываются при его инициализации (по крайней мере так пишется в умных книжках).
При получении данных из СОМ порта я начинаю заполнять этот массив, перезаписывая нули на принятые байты. Проблема в том, что у меня не получается точно определить сколько на самом деле я принял байт. Программа может проработать несколько часов, а потом "вылететь" с ошибкой: ![]() |
![]() |
![]() |
![]() |
#37 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
Вот когда добавляете ваши байты в масив, тогда и обновляйте счетчик - так всегда будете знать сколько у вас в массиве данных. Только когда обработаете данные не забудьте обнулить счетчик и начинайте писать в начало буфера.
У вас на баге - offset 0xCCCCCCCC - похоже на неинициализированный указатель. Просмотрите все переменные а еще лучше - включите все warnings компилятора. |
![]() |
![]() |
![]() |
#38 |
Пользователь
Регистрация: 05.01.2012
Сообщений: 27
|
![]()
Похоже, что ларчик просто открывался.
Когда экспериментировал со считыванием данных (подстраивался под длину кадра данных), уменьшил размер входного буфера. А вернуть забыл. ![]() После того, как восстановил, гонял прогу несколько недель. Подобных глюков больше не наблюдалось. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
расшифровка данных, принятых с COM-порта | IIUH | Общие вопросы Delphi | 25 | 12.04.2021 14:05 |
отправка/принятие данных с порта. | romank26 | Win Api | 1 | 26.03.2012 12:51 |
Считка данных по-битно из COM порта | Terran | Общие вопросы Delphi | 3 | 23.11.2011 04:19 |
Чтение данных с COM порта 232 | Dimitr_88 | Общие вопросы C/C++ | 10 | 03.09.2010 10:39 |
Приём данных с com порта | kyc0k | Помощь студентам | 3 | 28.03.2008 15:04 |