21xrx.com
2024-11-05 16:38:27 Tuesday
登录
文章检索 我的文章 写文章
C++串口助手编写
2023-07-05 12:26:10 深夜i     --     --
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++语言编写串口助手,可以帮助开发人员更方便地进行串口通讯和数据的读取、发送等功能。在编写串口助手的过程中,需要注意串口参数的配置和数据读取、发送等相关的函数的使用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复