我通过串口与宽带卡通信。我必须通过COM5读取GPS数据并通过执行命令并读取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;
}
答案 0 :(得分:2)
您正在打开两个COM端口,但只为其中一个设置串口参数(波特率,奇偶校验)和超时。
另一个是未知设置。毫不奇怪,你无法成功阅读它。没有超时,它可能会暂停尝试。