Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Управление прибором с компьютера через COM порт на Windows

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

Комментариев нет:

Отправить комментарий