21xrx.com
2025-03-30 05:06:41 Sunday
文章检索 我的文章 写文章
C++串口助手编写
2023-07-05 12:26:10 深夜i     9     0
C++ 串口 助手 编写 数据传输

C++串口助手是一种使用C++语言编写的串口通讯工具,可以帮助开发人员实现串口通讯和数据的读取、发送等功能。下面将介绍如何编写C++串口助手。

1. 确定串口配置

在编写C++串口助手之前,需要先确定串口的配置参数,包括波特率、校验位、数据位、停止位等。可以通过Windows API提供的函数来获取可用的串口列表和配置参数,如下所示:

#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
// 获取可用的串口列表
void GetSerialPortList()
{
  HKEY hKey;
  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &amp;hKey) == ERROR_SUCCESS)
  {
    TCHAR achKey[1024];
    DWORD cbName;
    for (DWORD i = 0, retValue = 0; retValue == ERROR_SUCCESS; i++)
    {
      cbName = sizeof(achKey);
      retValue = RegEnumValue(hKey, i, achKey, &amp;cbName, NULL, NULL, NULL, NULL);
      if (retValue == ERROR_SUCCESS)
      {
        TCHAR achValue[4096];
        DWORD cchValue = sizeof(achValue);
        if (RegQueryValueEx(hKey, achKey, NULL, NULL, (LPBYTE)achValue, &amp;cchValue) == ERROR_SUCCESS)
        {
          string name(achValue, cchValue);
          cout &lt;&lt; "\n[" &lt;&lt; i+1 &lt;&lt; "] " &lt;&lt; name;
        }
      }
    }
    RegCloseKey(hKey);
  }
  else
  
    cout &lt;&lt; "ERROR: Can not open the key." &lt;&lt; endl;
  
}
// 选择串口
HANDLE SelectSerialPort(string portName)
{
  HANDLE portHandle = CreateFileA(portName.c_str(),
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
  if (portHandle == INVALID_HANDLE_VALUE)
  {
    DWORD error = GetLastError();
    cout &lt;&lt; "ERROR: Can not open the port. Error code: " &lt;&lt; error &lt;&lt; endl;
    return NULL;
  }
  else
  
    cout &lt;&lt; "Port " &lt;&lt; portName &lt;&lt; " has been opened." &lt;&lt; endl;
    return portHandle;
  
}
// 配置串口
BOOL ConfigureSerialPort(HANDLE portHandle, int baudRate, int dataBits, int stopBits, int parity)
{
  DCB dcbSerialParams = { 0 };
  dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  if (GetCommState(portHandle, &amp;dcbSerialParams) == FALSE)
  
    cout &lt;&lt; "ERROR: Can not get the port state." &lt;&lt; endl;
    return FALSE;
  
  // 配置波特率
  dcbSerialParams.BaudRate = baudRate;
  // 配置数据位
  dcbSerialParams.ByteSize = dataBits;
  // 配置停止位
  switch (stopBits)
  
  case 1:
    dcbSerialParams.StopBits = ONESTOPBIT;
    break;
  case 2:
    dcbSerialParams.StopBits = TWOSTOPBITS;
    break;
  case 15:
    dcbSerialParams.StopBits = ONE5STOPBITS;
    break;
  default:
    cout &lt;&lt; "ERROR: Invalid stop bits." &lt;&lt; endl;
    return FALSE;
  
  // 配置校验位
  switch (parity)
  
  case 0:
    dcbSerialParams.Parity = NOPARITY;
    break;
  case 1:
    dcbSerialParams.Parity = ODDPARITY;
    break;
  case 2:
    dcbSerialParams.Parity = EVENPARITY;
    break;
  default:
    cout &lt;&lt; "ERROR: Invalid parity." &lt;&lt; endl;
    return FALSE;
  
  // 应用配置
  if (SetCommState(portHandle, &amp;dcbSerialParams) == FALSE)
  
    cout &lt;&lt; "ERROR: Can not set the port state." &lt;&lt; endl;
    return FALSE;
  
  // 配置超时
  COMMTIMEOUTS timeouts = { 0 };
  timeouts.ReadIntervalTimeout = MAXDWORD;
  timeouts.ReadTotalTimeoutConstant = 0;
  timeouts.ReadTotalTimeoutMultiplier = 0;
  timeouts.WriteTotalTimeoutConstant = 0;
  timeouts.WriteTotalTimeoutMultiplier = 0;
  if (SetCommTimeouts(portHandle, &amp;timeouts) == FALSE)
  
    cout &lt;&lt; "ERROR: Can not set the port timeouts." &lt;&lt; endl;
    return FALSE;
  
  cout &lt;&lt; "Serial port has been configured successfully." &lt;&lt; endl;
  return TRUE;
}

通过上述代码,我们可以获取可用的串口列表,并可以选择需要使用的串口,进行串口参数的配置。

2. 读取和发送数据

读取串口数据需要使用Windows API提供的ReadFile函数,发送数据需要使用WriteFile函数。如下所示:

// 读取数据
void ReadSerialPort(HANDLE portHandle)
{
  DWORD bytesRead = 0;
  char buffer[1024] = { 0 };
  while (true)
  {
    if (ReadFile(portHandle, buffer, sizeof(buffer), &amp;bytesRead, NULL) == TRUE)
    {
      string receivedData(buffer, bytesRead);
      cout &lt;&lt; "Received data: " &lt;&lt; receivedData &lt;&lt; endl;
    }
  }
}
// 发送数据
BOOL WriteSerialPort(HANDLE portHandle, string data)
{
  DWORD bytesWritten = 0;
  if (WriteFile(portHandle, data.c_str(), (DWORD)data.length(), &amp;bytesWritten, NULL) == FALSE)
  
    cout &lt;&lt; "ERROR: Can not write to the port." &lt;&lt; endl;
    return FALSE;
  
  cout &lt;&lt; "Data has been sent successfully." &lt;&lt; endl;
  return TRUE;
}

通过上述代码,我们可以实现串口的数据读取和发送功能。

3. 总结

通过C++语言编写串口助手,可以帮助开发人员更方便地进行串口通讯和数据的读取、发送等功能。在编写串口助手的过程中,需要注意串口参数的配置和数据读取、发送等相关的函数的使用。

  
  

评论区