Как опросить устройство по протоколу 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 программе все работает
