Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

04.03.2014, 11:04. Просмотров 1087. Ответов 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);
В чем может быть дело? Если для ответа на мою тему нужны уточнения, спрашивайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 11:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с СОМ-портом (C++):

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

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

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

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

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

работа с COM портом - C++
здравствуйте всем,я в форумах в первие ,и просил бы не судить очень строго. помогите пожалуйста , хочу реализовать приложение работающую с...

26
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 вообще чему равно?
0
volodymir
1 / 1 / 0
Регистрация: 20.02.2014
Сообщений: 23
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 элементов) нулевые.
0
Миниатюры
Работа с СОМ-портом  
volodymir
1 / 1 / 0
Регистрация: 20.02.2014
Сообщений: 23
04.03.2014, 12:52  [ТС] #18
dwRead всего ответа должен быть равен 221. Когда дробно приходит, то сначала 14, а потом -- 207.
0
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
0
volodymir
1 / 1 / 0
Регистрация: 20.02.2014
Сообщений: 23
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. Иногда вообще не приходит ничего.
0
THE--MASTER
Заблокирован
04.03.2014, 13:23 #21
Цитата Сообщение от volodymir Посмотреть сообщение
Поставил 221, все равно сначала приходит 14, а потом уже целиком 221. Иногда нажимаешь 1, а приходит один байт 255. Иногда вообще не приходит ничего.
Значит ты не до конца покурил мануал на девайс, он тебе наверное шлёт флаг подтверждения или ещё чего сначала и ждёт от тебя такого же положительного ответа, что ты всё принял - давай мнуал на свой девайс в студию с протоколом обмена Так и быть - посмотрю
0
volodymir
1 / 1 / 0
Регистрация: 20.02.2014
Сообщений: 23
04.03.2014, 13:30  [ТС] #22
Спасибо, что посмотришь. Вот ссылка на мануал: http://www.teplocom-sale.ru/upload/iblock/e36/modbusprotocol-vkt7.pdf.
0
THE--MASTER
Заблокирован
04.03.2014, 14:20 #23
посмотрю через 15 минут

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

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

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

Получить сигнал с СОМ-порта - C++
Здравствуйте.Собсно поставлена такая задача - получить по COM-порту код,преобразовать в число и вывести на экран.Тоесть например идет набор...

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

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


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

Или воспользуйтесь поиском по форуму:
27
04.03.2014, 15:05
Ответ Создать тему
Опции темы

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