2011-10-07 9 views
0

이 코드는 Windows 7 용입니다. AT 명령에 대한 응답을 받고 필요한 문자열 부분 만 인쇄하려고합니다. Visual Studio Express는 임의로이 코드로 메모리 예외가 있음을 알리고 있습니다. 매번 발생하지는 않습니다.COM 통신에 간헐적 인 메모리 예외 오류가 발생했습니다.

#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; 
} 
+0

나는 그것이 "임의"가 아니라고 확신합니다. –

+0

글쎄, 나는 아무것도 바꾸지 않기 때문에 모든 프로그램이 출력 텍스트가된다. – lodkkx

+0

컴퓨터가 임의로 작업을 수행하지 않습니다. –

답변

2

내장 된 반복기 디버깅은 substr() 호출에 대해 불평 할 것입니다. 다음과 같은 잘못된 가정을하고 있습니다.

  • ReadFile()은 직렬 포트 수신 버퍼에서 사용 가능한 것을 반환합니다. 직렬 포트는 느리고 일반적으로 한두 개의 문자 만 가져옵니다. dwBytesRead는 무시할 수 없습니다.
  • 직렬 포트가 C 문자열을 반환하지 않으면 바이트를 반환합니다. 제로 터미네이터를 얻지 못할 것입니다. dwBytesRead를 다시 사용하여 0을 직접 추가하십시오.

전체 응답을받을 때까지 ReadFile()을 계속 호출하십시오. 일반적으로 줄 바꿈 문자로 끝납니다. 그런 다음 응답을 처리합니다.

관련 문제