![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Mechatronic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2010 Репутация: нет Всего: нет |
Здравствуйте, есть проблема: если среди массива типа char имеется нулевой байт- он не передается через COM порт. Пользуюсь функциями API FileOpen, FileRead,FileWrite. FileWrite просто пропускает нулевой символ. Как можно бороться? Физически нулевой символ отправить не проблема- ведь стартовый и стоповые биты будут на месте. Можно, конечно, вместо нулевого байта подставить '0', но тогда прийдется выполнять лишние действия на оконечном усройстве, что не желательно.
Спасибо за внимание к проблеме. Это сообщение отредактировал(а) Mechatronic - 9.4.2010, 16:37 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
1. У тебя нигде не ведётся работа с массивом char, как со строкой?
2. При настройке COM-порта можно указать символ, при приёме которого считать, что данные поступили и их можно забирать из буфера (часто используется \n при работе с модемами). Не указан ли у тебя в качестве такого символа 0? 3. Покажи код -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Mechatronic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2010 Репутация: нет Всего: нет |
1.Ведется работа как со строкой после чтения из приемного буфера с целью отладки. Там, понятное дело- нули будут игнорироваться (так, игнорируется длинный хвост нулей- незанятых ячеек буфера). но то, что символ пропущен замечено еще на этапе отправки (FileWrite()): число переданных в порт символов numbytes_ok не совпадает с числом символов , переданных функции numbytes (меньше на количество нулевых).
2. Ничего подобного не настраивал. да и символ обрубает не только последний, а в середине. Далее идущие нормально передаются 3. Код ниже:
Это сообщение отредактировал(а) Mechatronic - 10.4.2010, 10:40 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
1. Ты используешь асинхронный ввод/вывод (судя по &Overlap в функции WriteFile), а CreateFile вызываешь без флага FILE_FLAG_OVERLAPPED. Может это и нормально, но попробуй поиграться с флагом и со структурой OVERLAPPED (с ней/без неё)
2. Попробуй заремить строку
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Mechatronic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2010 Репутация: нет Всего: нет |
Прошу прощения- внимательно вгляделся- отправляются всетаки все байты. Нули пропадают при приеме ( я замкнул TxD и RxD). Поставил на место FILE_FLAG_OVERLAPPED, и странная вещь: в переменную, отражающая реальное количество переданных/ принятых байт возвращается ноль, хотя приемный буфер заполняется (копия выходного буфера, но как и раньше- отсутствует символ \0).
Закомментил строки, связаные с установкой маски- ничего не изменилось Это сообщение отредактировал(а) Mechatronic - 10.4.2010, 13:53 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
после WriteFile/ReadFile нужно ждать событие hEvent из структуры OVERLAPPED. Всё-таки непонятное у тебя происходит. Давай проект в zip и в attach ужЕ самому интересно -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Mechatronic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2010 Репутация: нет Всего: нет |
Причина проста- дырявая память (не у компьютера). Вот эта строка
Есть прямая инструкция отбрасывать нулевые байты при их приеме. Когда и зачем поставил- не помню Событие ждать- это уже если хочется- WaitCommEvent для этого есть. Использую его уже при вызове функции. Но почему зануляется переменная numbytes_ok- мне не понятно. borisbn, спасибо за помощь- Ты настоящий друг!(с) Это сообщение отредактировал(а) Mechatronic - 10.4.2010, 14:57 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
|
|||
|
||||
| Mechatronic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2010 Репутация: нет Всего: нет |
borisbn, xvr ))))спасибо за разъяснения, теперь понял
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |