2011-10-24 1 views
1

Je communique avec une carte à large bande via des ports série. Je dois lire les données GPS sur COM5 et obtenir la force du signal en exécutant une commande et en lisant la réponse sur COM3. Chaque fois que j'essaye de lire/écrire sur COM3 le programme échoue à s'exécuter.Impossible d'exécuter le programme lorsque vous tentez de lire/écrire à partir d'un port COM donné

Quand je commenter les lignes contenant:

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

le programme fonctionne parfaitement.

Voici le code complet:

#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

L'affichage est trop long et vous ne spécifiez pas _how_ le programme échoue. – MSalters

+1

Comme je l'ai dit, il ne commence pas l'exécution, – lodkkx

+2

Nous n'avons pas tendance à croire en la magie, vraiment. Je suppose qu'il compile _does_? Et si vous mettez un point d'arrêt sur 'int main()', cela s'arrête tout de suite au début? Après tout, ces deux instructions n'ont pas encore été exécutées et Windows ne prend pas en charge le voyage dans le temps. Donc, à un moment donné, '' main'' commence, quelque chose de mal arrive. Quelle? – MSalters

Répondre

2

vous ouvrez deux ports COM, mais uniquement les paramètres de réglage de port série (vitesse de transmission, parité) et les délais d'attente pour l'un d'eux.

L'autre reste avec des paramètres inconnus. Pas de surprise que vous ne pouvez pas lire avec succès. Et sans un délai d'attente, il se peut que vous soyez suspendu.

Questions connexes