2011-10-24 36 views
1

我正在通過串行端口與寬帶卡進行通信。我必須通過COM5讀取GPS數據並通過執行命令並讀取COM3上的響應來獲得信號強度。任何時候我嘗試讀/寫COM3程序都無法執行。嘗試從某個COM端口讀取/寫入時,程序無法執行

當我註釋掉包含線路:

if(!WriteFile(hSerial2, wzBuff, 7, &dZBytesRead, NULL)) 
    std::cout << "Write error"; 
// 
if(!ReadFile(hSerial2, buff2, 30, &DZBYTES, NULL)) 
    std::cout << "Read Error"; 

程序運行完美。

下面是完整的代碼:

#include <Windows.h> 
#include <iostream> 
#include <string> 
#include <fstream> 
#include <vector> 
#include <time.h> 

using namespace std; 

vector<int> findLocation(string str, char character); 

int main() 
{ 

    time_t now; 
    time(&now); 



    ofstream myfile; 

    myfile.open("C:\\log.txt"); 

    HANDLE hSerial = CreateFile("COM5",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
    HANDLE hSerial2 = CreateFile("COM3",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 

    if(hSerial==INVALID_HANDLE_VALUE) 
     std::cout << "Cannot find serial port"; 

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

    if (!GetCommState(hSerial, &dcbSerialParams)) 
     std::cout << "COM State Error"; 

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

    if (!SetCommState(hSerial,&dcbSerialParams)) 
     std::cout << "COM State Error"; 


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


while(1) 
{ 



char szBuff[650+1] = {0}; 
char buff2[30+1] = {0}; 

char wzBuff[14] = {"AT+CSQ\r"}; 

DWORD dZBytesRead = 0; 
DWORD dwBytesRead = 0; 
DWORD DZBYTES = 0; 

//When I uncomment these next two calls my program will neither loop nor start 

//if(!WriteFile(hSerial2, wzBuff, 7, &dZBytesRead, NULL)) 
    //std::cout << "Write error"; 
// 
//if(!ReadFile(hSerial2, buff2, 30, &DZBYTES, NULL)) 
//std::cout << "Read Error"; 


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


// 
//if(dwBytesRead >1){ 


string test = string(szBuff); 
//std::cout << dwBytesRead << endl; 
//std::cout << test; 
// 
//cout << szBuff[1] << endl << endl; 

//myfile << test; 
// 
size_t found; 
size_t secondFound; 
//size_t first; 
//size_t second; 
//size_t third; 
//size_t fourth; 
// 


if(dwBytesRead > 50){ 
myfile.open("C:\\log.txt",fstream::in | fstream::out | fstream::app); 


found = test.rfind("$"); 
secondFound = test.find("\n"); 

time_t now; 
time(&now); 

string timenow = string(ctime(&now)); 

string final = test.substr(found,((secondFound - found)-1)); 
vector<int> locations = findLocation(final, ','); 

string lat = final.substr((locations[2]+1),12); 
string lon = final.substr((locations[4]+1),12); 

cout << lat << " " << lon << endl; 
myfile << lat << " " << lon << endl; 
myfile <<timenow << endl; 

//Wanting to get returned value from different COM port 
/*if(DZBYTES>20) 
{ 
    std::string test2 = std::string(buff2).substr(8,3); 
    myfile << test2 << endl; 
}*/ 

myfile << "________________________" << endl; 
myfile.close(); 

} 





//if (dZBytesRead > 10) 
//{ 
//std::string test2 = std::string(buff2).substr(8,3); 
//std::cout << test2 << endl; 
//myfile << test2 << endl; 
//} 

Sleep(400); 
} 

//myfile.close(); 
return 0; 
} 



vector<int> findLocation(string str, char character) 
{ 
    vector<int> characterLocations; 
    for(int i = 0; i < str.size(); i++) 
     if(str[i] == character) 
      characterLocations.push_back(i); 
    return characterLocations; 
} 
+0

Waaay太長了,你沒有指定_how_程序失敗。 – MSalters

+1

正如我所說,它不開始執行, – lodkkx

+2

我們並不傾向於相信魔術,真的。我認爲它_does_編譯?如果你在'int main()'上放置一個斷點,它在一開始就停止了嗎?畢竟,這兩條指令還沒有執行,Windows不支持時間旅行。所以,在「main」啓動後的某個時刻,會發生一些不好的事情。什麼? – MSalters

回答

2

你打開兩個COM端口,但只設置串口參數(波特率,奇偶校驗)和超時爲其中之一。

另一個留下未知設置。毫不奇怪,你無法成功讀取它。如果沒有超時,它可能會停止嘗試。