Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
#1

Работа с СОМ-портом - C++

04.03.2014, 11:04. Просмотров 1014. Ответов 26
Метки нет (Все метки)

Пишу программу для работы с устройством через COM-порт. Я отсылаю устройству запрос так:
C++
1
WriteFile(hComPort, buff, buffSize, &bytesWritten, NULL);
и жду ответа от прибора. buff -- это массив типа BYTE.

Ситуация такая. Присылаю запрос номер 1, приходит только его часть. Затем посылаю любой другой запрос, и приходит остаток от запроса 1. Пробовал соединить два компьютера через COM-порты. Я присылаю что-то -- на том компьютере отображается переданная строка. Мне присылают, тоже приходит. Затем я снова отправляю строку тому компьютеру, и тут же мне приходит строка из элементов 20, хотя с того компьютера ничего не отсылали.

Буфер COM-порта очищаю после каждого чтения данных следующей функцией:
C++
1
PurgeComm(hComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
В чем может быть дело? Если для ответа на мою тему нужны уточнения, спрашивайте.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 11:04     Работа с СОМ-портом
Посмотрите здесь:

Работа с COM портом - C++
Добрый день! Решил поработать с COM портом. в строке Port=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);...

Работа с COM - портом - C++
Не могу сделать чтобы, при работе с соm - портом возможно было выбирать как автоматические настройки по(default), так и ручные настройки....

Работа с COM портом - C++
Доброго времени суток, уважаемые форумчане! Помогите разобраться с COM портом. Хотя бы с чего начать. :help: На большинстве ресурсов...

работа с ком портом? - C++
Добрый день! Я ещё только учусь. Но мне очень бы хотелось научиться работать с ком портами в винде. посылка прием данных, и пр. ...

Работа с COM портом запись и чтение в один заход-как сделать? - C++
Столкнулся с тем что оборудование которое прицеплено к компорту не отвечает если сразу же после отправки пакета затребовать у него...

управление через СОМ порт - C++
Как сдельть сигнал на RTS,DTR по нажатию BUTTON1и2 соответственно. Причём при их отпускании сигналы должны обнульться! Кто шарит в этом?!

С++ код с использованием СОМ объектов. - C++
Пообещал другу написать прогу, кликер мыши в броузере(IE) на с++ с COM объектами. Вот код: #include <iostream> #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
THE--MASTER
Заблокирован
04.03.2014, 12:38     Работа с СОМ-портом #16
Цитата Сообщение от volodymir Посмотреть сообщение
DWORD dwRead = comstat.cbInQue, dwGot = 0;
ReadFile(hPort, buf, dwRead, &dwGot, NULL);
1. Попробуй захардкодь переменную dwRead = 60; - посмотри что получится
2. Попробуй поставить Sleep(5000); перед ReadFile - пусть для теста будет 5 секунд, будем твои таймауты наабум подбирать, раз ты не хочешь доки читать :-)

P.S.: у тебя DWORD dwRead = comstat.cbInQue здесь dwRead вообще чему равно?
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
04.03.2014, 12:50  [ТС]     Работа с СОМ-портом #17
Исправил. Теперь в коде стало так:
C++
1
2
3
4
DWORD dwGot = 0;
 
Sleep(5000);
ReadFile(hPort, buf, 60, &dwGot, NULL);
Результат (картинка). Так же дробно приходит ответ на запрос 1. Байты после 59 (нумерация с 0, 60 элементов) нулевые.
Миниатюры
Работа с СОМ-портом  
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
04.03.2014, 12:52  [ТС]     Работа с СОМ-портом #18
dwRead всего ответа должен быть равен 221. Когда дробно приходит, то сначала 14, а потом -- 207.
THE--MASTER
Заблокирован
04.03.2014, 12:54     Работа с СОМ-портом #19
Цитата Сообщение от volodymir Посмотреть сообщение
Так же дробно приходит ответ на запрос 1. Байты после 59 (нумерация с 0, 60 элементов) нулевые.
А с чего ты взял, что ответ дробно приходит? Я же задавал уже вопрос, сколько байт тебе конкретно нужно считывать в ответе??????
Цитата Сообщение от THE--MASTER Посмотреть сообщение
P.S.: у тебя DWORD dwRead = comstat.cbInQue здесь dwRead вообще чему равно?
!!!

У тебя после 59-го байта идут нули, т.к. твой приёмный буфер больше 60-и байт и ты его нулями инициализируешь наверное, а читаешь в него только 60 байт = тут всё правильно

Добавлено через 52 секунды
тогда пиши тут для теста так:
DWORD dwGot = 0;

Sleep(5000);
ReadFile(hPort, buf, 221, &dwGot, NULL);

P.S.: покажи инициализацию buf
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
04.03.2014, 13:03  [ТС]     Работа с СОМ-портом #20
Цитата Сообщение от THE--MASTER Посмотреть сообщение
сколько байт тебе конкретно нужно считывать в ответе?
Не для всех запросов оговорено, что должна быть такая-то длина ответа. Но в данном случае это, наверно, 221.

Инициализация buf:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
BYTE* buf = 0;
 
while (!terminated)
{
    if (!buf) buf = new BYTE[bufferSize];
    else
    {
        delete[] buf;
        buf = new BYTE[bufferSize];
    }
 
    // ...
}
Поставил 221, все равно сначала приходит 14, а потом уже целиком 221. Иногда нажимаешь 1, а приходит один байт 255. Иногда вообще не приходит ничего.
THE--MASTER
Заблокирован
04.03.2014, 13:23     Работа с СОМ-портом #21
Цитата Сообщение от volodymir Посмотреть сообщение
Поставил 221, все равно сначала приходит 14, а потом уже целиком 221. Иногда нажимаешь 1, а приходит один байт 255. Иногда вообще не приходит ничего.
Значит ты не до конца покурил мануал на девайс, он тебе наверное шлёт флаг подтверждения или ещё чего сначала и ждёт от тебя такого же положительного ответа, что ты всё принял - давай мнуал на свой девайс в студию с протоколом обмена Так и быть - посмотрю
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
04.03.2014, 13:30  [ТС]     Работа с СОМ-портом #22
Спасибо, что посмотришь. Вот ссылка на мануал: http://www.teplocom-sale.ru/upload/i...tocol-vkt7.pdf.
THE--MASTER
Заблокирован
04.03.2014, 14:20     Работа с СОМ-портом #23
посмотрю через 15 минут

Добавлено через 35 минут
Так, подробно смотреть мануал времени нет, тем паче не имея девайса под рукой.
Мое мнение, что ты не правильно общаешься со своим вычислителем, судя по доку:
Первым запросом должен быть запрос «Начало сеанса связи». Ответ анализи-
ровать не нужно. Далее необходимо сделать запрос на «Чтение данных». В ответе
вычислителя необходимо проанализировать поле «Версия сервера». После этого
необходимо получить «свойства» (см. ниже), после чего можно приступать к полу-
чению архивных/текущих данных.
Тоесть сначала надо всё это проделать, а потом уже работать, а ты пытаешься сразу работать - вот он тебе и ерунду возвращает .... Если не разберёшься -потом загляну сюда и помогу....
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
04.03.2014, 14:29  [ТС]     Работа с СОМ-портом #24
Спасибо, что взглянул. Пробовал уже: сначала посылаю запрос 7 (начало сеанса связи), а потом -- другие запросы. Та же ситуация.

Добавлено через 6 минут
Точнее, так: сначала посылается не менее 2 байт 0xFF, чтобы "разбудить" устройство. Потом запрос 7 (начало сеанса связи), затем -- запрос 5 (чтение данных) и потом уже остальные запросы. Но все равно ты ввел запрос 3, что-то выдалось. Затем вводишь цифру 4, и выдается то же, что и на цифру 3. И так надо несколько раз цифру 4 вводить, чтобы уже выдавался ответ на запрос 4.
THE--MASTER
Заблокирован
04.03.2014, 14:30     Работа с СОМ-портом #25
ну а ты читал в доке, про то, что он тебе отвечает вообще? Вот получил ты какой то на твой взгляд не полный ответ - почитай в доке что это такое и расшифруй его - он ж там может на сколько я помню исключения какие - то слать ...
volodymir
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 20
04.03.2014, 14:46  [ТС]     Работа с СОМ-портом #26
Да, насчет исключений надо посмотреть повнимательнее. Спасибо за помощь).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 15:05     Работа с СОМ-портом
Еще ссылки по теме:

Как на с++ прочитать данные из СОМ порта? - C++
Мне нужно под MS-DOS 6.22 прочитать несколько слов через СОМ порт (в пределах 2х десятков и потом эти слова проанализировать). Какое...

СОМ порт - как передать код - C++
Как в с++ передать код на com порт? К примеру на (* basic по моему) out(%.....), 4 на порт (%.....) выводим (out) число (4) в десятичном,...

Как создать чат между 2-мя сом-портами? - C++
Народ, всем привет! Есть задачка, создать чат меж двух СОМ-портов. Отправить, принять и вывести на экран сообщения. Пытаюсь найти хоть...

Прослушивание сом-порта через USB переходник - C++
Есть программа, которая отсылает и принимает данные через com-порт, задача состоит в том что бы делать тоже самое, но при условии, что...

Как программно получить адрес СОМ порта? - C++
Пишу программу для прошивки Flash памяти прибора через СОМ порт. Выяснилось, что при ошибке заливки, прибор выдаёт ошибку и начинает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SatanaXIII
04.03.2014, 15:05     Работа с СОМ-портом
  #27
 Комментарий модератора 
THE--MASTER, долго за вами уже пристально наблюдаю. Пункты 5.10, 4.6, 5.21. И это только за пару часов. Настоятельно советую вам не поступать так в дальнейшем.
Yandex
Объявления
04.03.2014, 15:05     Работа с СОМ-портом
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru