Последовательный порт связи приложение


Этот код подключается к COM 3, который имеет широкополосный карты и отправляет команду, которая возвращает значение RSSI. Я использую эту программу, чтобы увидеть закономерности в сила сигнала в определенных областях.

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
    HANDLE hSerial = CreateFile("COM3",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

    if(hSerial==INVALID_HANDLE_VALUE)
        std::cout << "Insert error message";

    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);

    if (!GetCommState(hSerial, &dcbSerialParams)) 
        std::cout << "Insert error message";

    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;

    if (!SetCommState(hSerial,&dcbSerialParams))
        std::cout << "Insert error message";


    COMMTIMEOUTS timeouts={0};
    timeouts.ReadIntervalTimeout=50;
    timeouts.ReadTotalTimeoutConstant=50;
    timeouts.ReadTotalTimeoutMultiplier=10;
    timeouts.WriteTotalTimeoutConstant=50;
    timeouts.WriteTotalTimeoutMultiplier=10;
    if(!SetCommTimeouts(hSerial, &timeouts))
        std::cout << "Insert error message";



    while(1)
    {
        char szBuff[50+1] = {0};
        char wzBuff[14] = {"AT+CSQ\r"};

        DWORD dZBytesRead = 0;
        DWORD dwBytesRead = 0;


        if(!WriteFile(hSerial, wzBuff, 7, &dZBytesRead, NULL))
            std::cout << "Write error";

        if(!ReadFile(hSerial, szBuff, 50, &dwBytesRead, NULL))
            std::cout << "Read Error";

        std::string subString = std::string(szBuff).substr(8,3);
        std::cout << subString;

        Sleep(500);
    }

    return 0;
}


1252
3
задан 5 октября 2011 в 05:10 Источник Поделиться
Комментарии
2 ответа

Во всех Тест, Что может быть ошибка. Вы действительно хотите продолжить, если есть ошибка?
Кажется, контрпродуктивно создать сообщение об ошибке и продолжить работу. Что будет генерировать больше ложных ошибок.

if(hSerial==INVALID_HANDLE_VALUE)
{
throw std::runtime_error("Insert error message");
}

Затем просто обернуть код в try блок catch:

try
{
... Code here
}
catch(std::exception const& e)
{
std::cerr << "Exception: " << e.what() << "\n";
throw; // re-throw so the OS can provide help if available.
}
catch(...)
{
std::cerr << "Exception: Unknown ...\n";
throw;
}

1
ответ дан 5 октября 2011 в 07:10 Источник Поделиться

В дополнение к тому, что уже сказано, вот некоторые замечания и удобных вещей, чтобы иметь в виду.


  • Хорошей практикой является всегда открытым COM-порты со строкой, глядя, как \.\Порт COM3, иначе вы не сможете открыть COM-порты выше число 10. Это довольно жесткий баг поймать, если вы не осознаете этого. В C это будет выглядеть:

    CreateFile("\\\\.\\COM3" ...

  • Вы всегда должны проверить характер поступающих данных независимо от того, если функцию ReadFile был успешным. Там может быть мусор и шум по интерфейсам RS-232, особенно в тот момент, когда классический 9-пиновый коннектор dsub подключен или удалены. В вашем случае с АТ командами, это легко, вы должны просто проверить, если данные действительны ASCII или завершения null. Если нет, вы получили некоторые ненужные сведения.

    if(isalnum(ch) || isspace(ch) || ch=='\0')
    {
    // ok
    }
    else
    {
    // error
    }

  • Если функцию ReadFile не удалось, вам может потребоваться добавить некоторые дополнительные проверки, по крайней мере:

    DWORD last_error = GetLastError();
    if(last_error == ERROR_OPERATION_ABORTED)
    {
    // There is nobody sending any longer, close the port?
    }

  • Закрыть порты, когда вы не используете их больше. Пока вы не закрыли порт с CloseHandle(), вы будете блокировать других программ с помощью этого порта. Окна, вероятно, сделать это, когда программа завершается, но хорошая практика, чтобы всегда очистить свой собственный беспорядок.

1
ответ дан 10 октября 2011 в 02:10 Источник Поделиться