#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; // ... После чего просто отправить эти два байта в устройство.
Комментариев нет:
Отправить комментарий