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

Как правильно создать ModBus ASCII запрос? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Почему происходит ошибка undefined reference to hgeCreate http://www.cyberforum.ru/cpp/thread1647650.html
Всем привет. Я новичок по C++ и недавно решил освоить разработку игр. Скачал с интернета 2D движок для графики HGE, однако никак не могу скомпилировать даже пример, ибо компилятор ругается. Код примера: #include "include/hge.h" HGE *hge = 0; bool FrameFunc() { if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true; return false;
C++ Переписать код из ASM на С++ для сборки под x64 Задача: переписать код из ASM на C++ для сборки под X64 Ибо я ASM не знаю #include "stdafx.h" #include "xrTheora_Surface_mmx.h" #pragma warning( disable : 4731 ) #pragma pack( push ) #pragma pack( 1 ) http://www.cyberforum.ru/cpp/thread1647574.html
C++ Как работать с xpath используя библиотеку xmlpp?
Мучаюсь весь день с xPath... Не могу понять как с ним работать? Допустим такой код: std::string StatusProfile = ".//*/span/span/text()"; auto status_profile = root->find(StatusProfile); std::cout << "Статус: " << dynamic_cast<xmlpp::ContentNode*>(status_profile)->get_content() << std::endl; В ответ получаю - Ошибка сегментирования (сделан дамп памяти). Не пойму что я делаю не так,...
C++ Распознавание текста
народ всем привет) подскажите пожалуйста литература, а если быть точнее как написать сканер текста( приложения) в каком направлении капать? если кто писал или есть какие нибудь статьи напишите пожалуйста) хочу попробовать написать для опыта) kcoding.net/2012/qrcode-coding-decoding-libs/ библиотека QR-кодов подойдет для распознавания текста(слова или буквы) с камеры телефона
C++ Темы из раздела С++ для экспертов и другие интересные темы http://www.cyberforum.ru/cpp/thread1646935.html
Раздел закрыт и темы перенеслись в раздел С++. Здесь находится список тем, которые были в разделе, чтобы они совсем не затерялись. http://www.cyberforum.ru/cpp/thread1244422.html http://www.cyberforum.ru/cpp/thread323714.html http://www.cyberforum.ru/cpp/thread1221708.html http://www.cyberforum.ru/cpp/thread1085808.html http://www.cyberforum.ru/cpp/thread1076677.html...
C++ Движение Бильярдного шара по столу без луз Доброго времени суток товарищи! Случилось "бяда" с написанием программ.и нужно ее написать на C++ в консольном режиме. Я писал в основном на vba и delphi. с++ только начал изучать. и тут такая задачка. "Изобразить на экране движение шара по бильярду без луз. Скорость движения шара уменьшается с постоянным ускорением." с основами работы в консоли я толком не знаком. Реально ли это? если да то... подробнее

Показать сообщение отдельно
schdub
 Аватар для schdub
2916 / 1260 / 227
Регистрация: 19.01.2009
Сообщений: 3,274
Завершенные тесты: 1
26.01.2016, 19:30     Как правильно создать ModBus ASCII запрос?
slavka_online, в приведенном коде cmd - в строковом представлении, а отсылать нужно в бинарном.
Но исходя из того что вы создали Как из числа 0Fh получить "0F" ? вы это уже поняли.

Для начала попробуйте отослать устройству вот такой пакет:
C++
1
2
3
4
5
6
7
8
    QByteArray buffer;
    buffer.append(":\x26", 2);
    buffer.append("\x03\x00", 2);
    buffer.append("\x00\x00", 2);
    buffer.append("\x04\x00", 2);
    buffer.append(calculateLRC(buffer));
    buffer.append("\x0d\x0a", 2);
    qDebug() << buffer.toHex();
Ответит оно вам?

Цитата Сообщение от slavka_online Посмотреть сообщение
нужно передать что то вроде этого ":260300000004<LRC>0D0A"
кстати, если "количество" это 2 байта, то вы пропустили один нулевой байт перед LRC.

И по поповоду LRC: мне кажется подозрительным что его подсчет идет с 1-го индекса вместо 0-го.

Добавлено через 19 минут
slavka_online, ну а вообще с пакетом обычно работают через определенную структуру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// ...
 
// заботимся о выравнивании структур
// погуглите как это делается для вашего
// компилятора, если мои макросы не подходят
#if defined(_MSC_VER)
// если у нас MSVC
#pragma pack(push)
#pragma pack(1)
#define GCCSTRUCTPACKED
#else
// если GCC
#define GCCSTRUCTPACKED __attribute__((packed))
#endif
 
// определяем стуктуру отражающую пакет
struct YOUR_AWESOME_PACKAGE {
    unsigned char cmd[2];   // 2 байта
    unsigned short funtion; // 2 байта
    unsigned short begin;   // 2 байта
    unsigned short amount;  // 2 байта
} GCCSTRUCTPACKED;
 
// возвращаем выравнивае структур как это было раньше
#undef GCCSTRUCTPACKED
#if defined(_MSC_VER)
#pragma pack(pop)
#endif
 
// ...
 
    // теперь в коде функции формируем пакет
    QByteArray buffer;
    // резервируем память под пакет
    buffer.resize(sizeof(YOUR_AWESOME_PACKAGE));
    // получаем указатель на выделенную память
    YOUR_AWESOME_PACKAGE * pack = reinterpret_cast<YOUR_AWESOME_PACKAGE *>(buffer.data());
    // заполняем пакет
    pack->cmd[0] = ':';
    pack->cmd[1] = 0x26;
    pack->funtion = 3; // если byteoreder не соответсвует нашему
    pack->begin   = 0; // то приводим его к "общему знаменателю"
    pack->amount  = 4; // для этих переменнх
    buffer.append(calculateLRC(buffer));
    buffer.append("\x0d\x0a", 2);
    qDebug() << buffer.toHex();
 
    // здесь в buffer "лежит" сформированный пакет, который
    // можно отправлять устройству
 
// ...
Добавлено через 6 минут
И да, вы уверены что пакет должен быть именно в ASCII (не заметил сразу)?

Добавлено через 23 минуты
Ну а если данные пакета (т.е. от номера функции по количество включительно) должны быть в ASCII, то можно поступить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    // формируем данные
    QByteArray data; {
        QDataStream stream(&data, QIODevice::WriteOnly);
        stream.setByteOrder(QDataStream::LittleEndian);
        stream << (unsigned char) 0x26;
        stream << (unsigned short) 3; // номер функции
        stream << (unsigned short) 0; // начало
        stream << (unsigned short) 4; // количество
    }
 
    // формируем пакет полностью
    QByteArray buffer;
    buffer.append(':');
    buffer.append(data);
    buffer.append(calculateLRC(buffer));
    buffer.append("\x0d\x0a");
 
    // "3a26030000000400d30d0a"
    qDebug() << buffer.toHex();
 
    // здесь в buffer "лежит" сформированный пакет, который
    // можно отправлять устройству
 
Текущее время: 20:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru