此代码适用于Windows7。我正在尝试获取对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;
}

最佳答案

内置的迭代器调试将抱怨您的substr()调用。您做出了一些错误的假设:


ReadFile()将仅返回串行端口接收缓冲区中的可用内容。串行端口速度很慢,通常只能获得一个或两个字符。您不能忽略dwBytesRead。
串行端口不返回C字符串,而是返回字节。您不会得到零终止符。再次使用dwBytesRead自己添加零。


继续调用ReadFile(),直到收到完整的响应。通常以换行符终止。然后处理响应。

关于c++ - COM通信出现间歇性内存异常错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7688739/

10-09 05:50