21xrx.com
2024-09-19 09:46:54 Thursday
登录
文章检索 我的文章 写文章
C++串口数据接收
2023-07-11 17:35:25 深夜i     --     --
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++编程语言实现串口数据接收的基本过程和代码实现方法。实际应用中还需要根据实际需求进行相应的修改和优化。

  
  

评论区

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