1

I am communicating with a broadband card over serial ports. I have to read the GPS data over COM5 and get the signal strength by executing a command and reading the response on COM3. Anytime I try to read / write to COM3 the program fails to execute.

When I comment out the lines containing:

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

the program runs flawlessly.

Here is the full code:

#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;
}
5
  • Waaay too long, and you don't specify how the program fails. Commented Oct 24, 2011 at 14:03
  • 1
    As I stated it doesn't begin execution, Commented Oct 24, 2011 at 14:05
  • 2
    We don't tend to believe in magic, really. I assume it does compile? And if you put a breakpoint on int main(), it does stop right at the beginning? After all, those two instructions haven't executed yet, and Windows doesn't support time travel. So, at some moment after main starts, something bad happens. What? Commented Oct 24, 2011 at 14:09
  • It doesn't stop but the program doesn't loop. It never writes the data to my file object or output stream. Commented Oct 24, 2011 at 14:16
  • 1
    So it does begin execution. Next myth, not looping. Since there's nothing in the while(1) loop that would cause it to exit, I'm fairly certain that it will loop forever. One of the I/O functions may block, of course. Commented Oct 24, 2011 at 14:39

1 Answer 1

2

You're opening two COM ports, but only setting serial port parameters (baud rate, parity) and timeouts for one of them.

The other is left with unknown settings. No surprise that you can't read from it successfully. And without a timeout, it may just hang trying.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.