Прерывистая ошибка исключения памяти при связи COM - PullRequest
0 голосов
/ 07 октября 2011

Этот код для Windows 7. Я пытаюсь получить ответ на команду AT и вывести только ту часть строки, которая мне нужна.Visual Studio Express случайным образом сообщает мне, что у меня есть исключения из памяти с этим кодом.Это происходит не каждый раз.

#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:: cout << szBuff;
std::string test = std::string(szBuff).substr(8,10);
std::cout << test;
Sleep(500);
}

return 0;
}

1 Ответ

2 голосов
/ 07 октября 2011

Встроенная отладка итератора будет жаловаться на ваш вызов substr (). Вы делаете неправильные предположения:

  • ReadFile () вернет только то, что доступно в приемном буфере последовательного порта. Последовательные порты медленные, обычно вы получаете только один или два символа. Вы не можете игнорировать dwBytesRead.
  • Последовательный порт не возвращает строки C, он возвращает байты. Вы не получите нулевой терминатор. Снова используйте dwBytesRead, чтобы добавить ноль самостоятельно.

Продолжайте вызывать ReadFile (), пока не получите полный ответ. Обычно завершается символом перевода строки. Затем обработайте ответ.

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