#cpp #visual_studio #visual_cpp #com_порт #rs232
Добрый день,
Мне нужно реализовать программу управления прибором E7-25. Подключается этот прибор
к компьютеру через usb кабель, и при подключении создается виртуальный com-порт. Подключиться
к этому порту у меня получается, передачу данных и прием данных проверял при помощи
Virtual Serial Port Driver, и данные отправляются и передаются, но при отправке данных
на прибор в виде:
char data[] = "(0xAA, 14)";
прибор не отвечает вообще ничего.
Вот код моей программы
#include "stdafx.h"
#include
#include
using namespace std;
HANDLE hSerial;
void ReadCOM()
{
DWORD iSize;
char sReceivedChar[20];
while (true)
{
ReadFile(hSerial, &sReceivedChar, 20, &iSize, 0);
if (iSize > 0)
cout << sReceivedChar;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
LPCTSTR sPortName = L"COM4";
hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hSerial==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
cout << "serial port does not exist.\n";
}
cout << "some other error occurred.\n";
}
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
cout << "getting state error\n";
}
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
{
cout << "error setting serial port state\n";
}
char data[] = "(0xAA, 64)";
DWORD dwSize = sizeof(data);
DWORD dwBytesWritten;
LPOVERLAPPED ov;
BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten ,NULL);
cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. "
<< endl;
while(1)
{
ReadCOM();
}
return 0;
}
В документации к прибору написано, что команды ему нужно посылать в следующем формате
Формат обмена:
ПК — E7-25: 0xAA, №команды, [параметры].
Е7-25 — ПК: 0xAA, №команды, [параметры].
То есть вот что должна возвращать та команда, которую я по умолчанию отправляю
64 – Получить имя прибора
ПК — (0xAA, 64); E7-25 — (0xAA, 64, “Е725”)
Поэтому у меня есть вопросы.
Правильно ли я отправляю данные в порт? И правильно ли я их принимаю из порта?
Заранее спасибо.
Ответы
Ответ 1
Протокол связи с прибором у Вас - очевидно бинарный, Вы сами его привели. Затем Вы
зачем-то посчитали двоичные данные - строкой, а потом добавили по бокам ещё два байта
скобок плюс нулевой байт на конце:
char data[] = "(0xAA, 64)"; // эквивалентно: char data[11] = {'(', '0', 'x', 'A',
'A', ',', ' ', '6', '4', ')', 0x00}
Зачем это было сделано? Возможно, стоит подучить синтаксис.
Нужно сформировать массив этих двух байтов, чтобы не было ничего лишнего
char data[2] = {0xAA, 64};
DWORD dwSize = 2;
// ...
После чего просто отправить эти два байта в устройство.