Программа не запускается при попытке чтения / записи с определенного COM-порта - PullRequest
1 голос
/ 24 октября 2011

Я общаюсь с широкополосной картой через последовательные порты. Я должен прочитать данные GPS через COM5 и получить уровень сигнала, выполнив команду и прочитав ответ на COM3. Каждый раз, когда я пытаюсь читать / записывать в COM3, программа не выполняется.

Когда я закомментирую строки, содержащие:

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;
}

1 Ответ

2 голосов
/ 24 октября 2011

Вы открываете два COM-порта, но устанавливаете только параметры последовательного порта (скорость передачи, четность) и время ожидания для одного из них.

Другой остается с неизвестными настройками. Не удивительно, что вы не можете прочитать его успешно. А без таймаута он может просто зависнуть, пытаясь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...