如何获取串行通信数据并在 C++ 中使用它?

问题描述

我只有一个 UART 到 USB 转换器模块,我正在将该模块与 GPS 模块连接。所以现在GPS模块连接到转换器,转换器通过micro USB线连接到我的PC。

我使用 PuTTY 读取来自 GPS 的串行数据。但是,我希望从 C++ 语言中读取相同的数据。

我不想使用 Arduino,我也不能使用 Arduino IDE,因为我没有使用 Arduino 板。

我该怎么做?是否有 C++ 库可以让我访问串行数据?

我使用的是 Windows 10

解决方法

我附上了一个小样本,用于测试我的 USB 转串口适配器。

#include<windows.h>
#include<iostream>

int main()
{

    HANDLE hComm;
    std::string port_name = "COM1";  //change port name
    char write_buffer[] = "Test Data";
    char read_buffer[100];
    DWORD dNoOFBytestoWrite;         // No of bytes to write into the port
    DWORD dNoOfBytesWritten = 0;     // No of bytes written to the port
    DWORD bytes_read = 0;

    hComm = CreateFileA(port_name.c_str(),//port name
        GENERIC_READ | GENERIC_WRITE,//Read/Write
        0,// No Sharing
        NULL,// No Security
        OPEN_EXISTING,// Open existing port only
        0,// Non Overlapped I/O
        NULL);        // Null for Comm Devices

    if (hComm == INVALID_HANDLE_VALUE)
    {
        std::cerr << "Error in opening serial port”";
        return -1;
    }
    else
        std::cerr << "opening serial port successful";

    DCB dcbSerialParams = { 0 }; // Initializing DCB structure
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    GetCommState(hComm,&dcbSerialParams);

    dcbSerialParams.BaudRate = CBR_9600;  // Setting BaudRate = 9600
    dcbSerialParams.ByteSize = 8;         // Setting ByteSize = 8
    dcbSerialParams.StopBits = ONESTOPBIT;// Setting StopBits = 1
    dcbSerialParams.Parity = NOPARITY;  // Setting Parity = None
    SetCommState(hComm,&dcbSerialParams);

    COMMTIMEOUTS timeouts = { 0 };
    timeouts.ReadIntervalTimeout = 20; // in milliseconds
    timeouts.ReadTotalTimeoutConstant = 100; // in milliseconds
    timeouts.ReadTotalTimeoutMultiplier = 10; // in milliseconds
    timeouts.WriteTotalTimeoutConstant = 100; // in milliseconds
    timeouts.WriteTotalTimeoutMultiplier = 10; // in milliseconds 


    dNoOFBytestoWrite = sizeof(write_buffer);

    WriteFile(hComm,// Handle to the Serial port
        write_buffer,// Data to be written to the port
        dNoOFBytestoWrite,//No of bytes to write
        &dNoOfBytesWritten,//Bytes written
        NULL);
    do
    {
        ReadFile(hComm,//Handle of the Serial port
            &read_buffer,//Temporary character
            100,//Size of TempChar
            &bytes_read,//Number of bytes read
            NULL);

    } while (bytes_read <= 0);

    std::cout << "Read Data : " << read_buffer << std::endl;
    CloseHandle(hComm);//Closing the Serial Port

    return 0;
}