21xrx.com
2025-03-28 20:39:51 Friday
文章检索 我的文章 写文章
C++串口数据接收
2023-07-11 17:35:25 深夜i     32     0
C++ 串口 数据接收 通信 编程

C++编程语言具有广泛的应用范围,而串口数据接收是其中一个应用领域。对于需要从外部设备获取数据的应用程序,例如机器人控制系统、数据采集系统等,都需要串口数据接收功能。在C++编程中实现串口数据接收功能的过程并不复杂,本文将介绍实现方法。

1.打开串口

首先,需要打开串口,得到串口句柄。打开串口时需要设置串口号、波特率、数据位、停止位、校验位等参数,以及设置超时时间等。

以下是打开串口函数的代码示例:

HANDLE OpenPort(const char* port, int rate, int databits, int stopbits, int parity)
{
  HANDLE hComm = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  if (hComm == INVALID_HANDLE_VALUE) return NULL;
  DCB dcb;
  memset(&dcb, 0, sizeof(dcb));
  dcb.DCBlength = sizeof(dcb);
  if (!GetCommState(hComm, &dcb)) return NULL;
  dcb.BaudRate = rate;
  dcb.ByteSize = databits;
  dcb.StopBits = stopbits;
  dcb.Parity = parity;
  if (!SetCommState(hComm, &dcb)) return NULL;
  COMMTIMEOUTS timeouts;
  memset(&timeouts, 0, sizeof(timeouts));
  timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
  timeouts.ReadTotalTimeoutConstant = 0;
  timeouts.ReadTotalTimeoutMultiplier = 0;
  if (!SetCommTimeouts(hComm, &timeouts)) return NULL;
  return hComm;
}

2.接收数据

接下来,需要使用ReadFile函数从串口中读取数据。当串口中有数据时,ReadFile函数将把数据读入指定的缓冲区中。需要注意的是,ReadFile函数读取的字节数最多不能超过指定的缓冲区大小。

以下是数据接收函数的代码示例:

int ReceiveData(HANDLE hComm, char* buffer, int len)
{
  DWORD dwBytesRead = 0;
  if (!ReadFile(hComm, buffer, len, &dwBytesRead, NULL)) return 0;
  return (int)dwBytesRead;
}

3.关闭串口

在使用完串口后,应该关闭串口,释放系统资源。

以下是关闭串口函数的代码示例:

void ClosePort(HANDLE hComm)
{
  if (hComm != NULL) CloseHandle(hComm);
}

4.完整代码实例

下面是一个简单的串口数据接收程序的完整代码示例:

#include <Windows.h>
#include <iostream>
using namespace std;
HANDLE OpenPort(const char* port, int rate, int databits, int stopbits, int parity)
{
  HANDLE hComm = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  if (hComm == INVALID_HANDLE_VALUE) return NULL;
  DCB dcb;
  memset(&dcb, 0, sizeof(dcb));
  dcb.DCBlength = sizeof(dcb);
  if (!GetCommState(hComm, &dcb)) return NULL;
  dcb.BaudRate = rate;
  dcb.ByteSize = databits;
  dcb.StopBits = stopbits;
  dcb.Parity = parity;
  if (!SetCommState(hComm, &dcb)) return NULL;
  COMMTIMEOUTS timeouts;
  memset(&timeouts, 0, sizeof(timeouts));
  timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
  timeouts.ReadTotalTimeoutConstant = 0;
  timeouts.ReadTotalTimeoutMultiplier = 0;
  if (!SetCommTimeouts(hComm, &timeouts)) return NULL;
  return hComm;
}
int ReceiveData(HANDLE hComm, char* buffer, int len)
{
  DWORD dwBytesRead = 0;
  if (!ReadFile(hComm, buffer, len, &dwBytesRead, NULL)) return 0;
  return (int)dwBytesRead;
}
void ClosePort(HANDLE hComm)
{
  if (hComm != NULL) CloseHandle(hComm);
}
int main()
{
  HANDLE hComm = OpenPort("COM1", 9600, 8, 1, NOPARITY);
  if (hComm == NULL)
    cout << "Open COM1 failed!" << endl;
    return 0;
  
  char buffer[1024] = "";
  while (1) {
    int len = ReceiveData(hComm, buffer, sizeof(buffer));
    if (len > 0) {
      buffer[len] = '\0';
      cout << "Receive data: " << buffer << endl;
    }
    Sleep(100);
  }
  ClosePort(hComm);
  return 0;
}

以上是使用C++编程语言实现串口数据接收的基本过程和代码实现方法。实际应用中还需要根据实际需求进行相应的修改和优化。

  
  

评论区