Как опросить устройство по протоколу modbus

Есть код:

#include <windows.h>
#include <iostream>
#include <TCHAR.h>
using namespace std;
#pragma warning(disable:4996)
//обработчик COM порта
HANDLE hSerial;
//название порта
LPCTSTR sPortName = L"COM3";
void ReadCOM(int &a)
{
    DWORD iSize;
    char sReceivedChar = {0};
    char recBuf[100] = {0};
    recBuf[0] = '\0';
    while (true)
    {
        //получение ответа
        ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
        if (iSize > 0)   // если что-то принято, выводим
        {
            cout << "Answer: " << sReceivedChar;
            strcat(recBuf,&sReceivedChar);
        }
        else
        {
            cin >> a;
            return;
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    int a = 0;
    //открытие порта для чтения/записи
    hSerial = CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    cout << hSerial << endl;
    //проверка роботоспособности (не работает)
    if (hSerial == INVALID_HANDLE_VALUE)
    {
        if (GetLastError() == ERROR_FILE_NOT_FOUND)
        {
            cout << "wrn::Serial port does NOT exist.\n";
        }
        else
        {
            cout << "wrn::Some other error occurred.\n";
        }
    }
    //(работает) пишем соответствующее сообщение
    else
    {
        cout << "suc::Serial port DOES exist.\n";
    }
    //настройка параметров соединения (В данном случае COM порта)
    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    //извлечение данных о текущих настройках управляющих сигналов
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
        cout << "wrn::getting state error\n";
    }
    //скорость подключения в бод
    dcbSerialParams.BaudRate = CBR_9600;

    //количество информационных бит
    dcbSerialParams.ByteSize = 8;

    // количество стоп-битов
    // ONESTOPBIT - 1 стоп-бит
    // ONE5TOPBITS - 1.5 стоп-бита
    // TWOSTOPBITS - 2 стоп-бита
    dcbSerialParams.StopBits = TWOSTOPBITS;

    //режим проверки на четность
    // NOPARITY – нет проверки,
    // EVENPARITY – проверка на четность
    // ODDPARITY – проверка на нечетность
    dcbSerialParams.Parity = NOPARITY;

    //запись свойств порта
    if (!SetCommState(hSerial, &dcbSerialParams))
    {
        cout << "wrn::error setting serial port state\n";
    }

    //установка таймаута приема и передачи порта
    COMMTIMEOUTS CommTimeOuts = { 0xFFFFFFFF,0,0,0,2000 };
    if (!SetCommTimeouts(hSerial, &CommTimeOuts))
    {
        cout << "wrn::error" << endl;
    }

    char data[] = "15 03 006B 0003 7687";
    //char data[] = { 0x21, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A ,'\r'};
    //char data[] = { 0x21, 0x03, 0x006B, 0x0003, 0x7687, '\r'};
    //подсчет контрольной суммы
    /* int b[] = {0x21, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
    int c = 0x00;
    for (int i = 0; i < 8; ++i)
    {
        c ^= b[i];
    }
    cout << "0x" << hex << uppercase << c << endl;*/

    DWORD dwSize = sizeof(data);            // размер этой строки
    DWORD dwBytesWritten;                   // тут будет количество собственно переданных байт
    BOOL iRet = WriteFile(hSerial, data, dwSize, &dwBytesWritten, NULL);
    if (dwBytesWritten != dwSize)
    {
        cout << "wrn::error 2" << "\ndb = " << dwBytesWritten << "\nds=" << dwSize << endl;
    }
    cout << "nor::" << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;
    while (a==0)
    {
        ReadCOM(a);
        cout << a << endl;
    }


    CloseHandle(hSerial);
    return 0;
}

Подключен через COM3 порт, все данные ввел, но ответа не получаю работа кода

Хотя в RMMS программе все работает работа программы


Ответы (0 шт):