Reputation: 1173
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;
}
Upvotes: 1
Views: 384
Reputation: 283614
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.
Upvotes: 2