此代码适用于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/