c++ - 尝试从某个 COM 端口读取/写入时程序无法执行

标签 c++ c windows serial-port

我正在通过串行端口与宽带卡通信。我必须通过 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;
}

最佳答案

您正在打开两个 COM 端口,但仅为其中一个端口设置串口参数(波特率、奇偶校验)和超时。

另一个留下了未知的设置。您无法成功读取它也就不足为奇了。如果没有超时,它可能会挂起尝试。

关于c++ - 尝试从某个 COM 端口读取/写入时程序无法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7876519/

相关文章:

c++ - STL Vector是否默认使用 'new'和 'delete'进行内存分配?

c++ - Windows 7 中的 TCP 窗口缩放

c - 将字符串数组编码为单个字符串

c - 用指针访问结构体的变量时,Cache 会带什么?

使用 OpenCOBOL 进行 Windows GUI 编程?

c# - 如何确定用户是否具有管理员权限?

c++ - 如何让 LLDB 输出图像?

c - MPI_发送(97)。 : Invalid rank has value 13 but must be nonnegative and less than 0

windows - 创建具有自定义扩展名的文件夹

c++ - WinAPI函数启动帮助文件