C++ 串口应用——自定义串口类
时间: 2023-09-02 09:15:54 浏览: 62
在 C++ 中,我们可以使用串口类来进行串口通信。这里我们将自定义一个串口类,以便更好地理解串口通信的原理和实现。
首先,我们需要引入一些头文件:
```c++
#include <windows.h>
#include <iostream>
```
接着,我们定义一个串口类,其中包含了串口的打开、关闭、读取和写入等操作:
```c++
class SerialPort
{
public:
SerialPort();
~SerialPort();
bool Open(int portNo, int baudRate);
bool Close();
int ReadData(char *buffer, unsigned int nbChar);
bool WriteData(char *buffer, unsigned int nbChar);
bool IsOpened() const;
private:
HANDLE m_hComm;
bool m_bOpened;
};
```
其中,m_hComm 是串口的句柄,m_bOpened 表示串口是否打开。
接下来,我们来实现这些操作。
首先是串口的打开操作:
```c++
bool SerialPort::Open(int portNo, int baudRate)
{
if (m_bOpened) {
Close();
}
char portName[50];
sprintf_s(portName, "\\\\.\\COM%d", portNo);
m_hComm = CreateFile(portName,
GENERIC_READ | GENERIC_WRITE,
0,
nullptr,
OPEN_EXISTING,
0,
nullptr);
if (m_hComm == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open serial port!\n";
return false;
}
DCB dcb;
GetCommState(m_hComm, &dcb);
dcb.BaudRate = baudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(m_hComm, &dcb)) {
std::cerr << "Failed to set serial port parameters!\n";
CloseHandle(m_hComm);
return false;
}
m_bOpened = true;
return true;
}
```
这里我们首先判断串口是否已经打开,如果已经打开则先关闭,然后根据串口号构建串口名称,并使用 CreateFile 函数打开串口。接着,我们设置串口的参数,包括波特率、数据位、校验位和停止位等。如果设置成功,则将 m_bOpened 设置为 true 并返回 true,否则返回 false。
接下来是串口的关闭操作:
```c++
bool SerialPort::Close()
{
if (!m_bOpened) {
return true;
}
if (CloseHandle(m_hComm)) {
m_bOpened = false;
return true;
}
return false;
}
```
这里我们只需要调用 CloseHandle 函数关闭串口,并将 m_bOpened 设置为 false 即可。
接下来是串口的读取操作:
```c++
int SerialPort::ReadData(char *buffer, unsigned int nbChar)
{
DWORD bytesRead;
if (!ReadFile(m_hComm, buffer, nbChar, &bytesRead, nullptr)) {
std::cerr << "Failed to read data from serial port!\n";
return -1;
}
return bytesRead;
}
```
这里我们使用 ReadFile 函数从串口读取数据,并将读取的字节数存储在 bytesRead 变量中,并返回 bytesRead。
最后是串口的写入操作:
```c++
bool SerialPort::WriteData(char *buffer, unsigned int nbChar)
{
DWORD bytesSent;
if (!WriteFile(m_hComm, buffer, nbChar, &bytesSent, nullptr)) {
std::cerr << "Failed to write data to serial port!\n";
return false;
}
return true;
}
```
这里我们使用 WriteFile 函数将数据写入串口,并返回写入是否成功的结果。
最后,我们来实现一个判断串口是否打开的函数:
```c++
bool SerialPort::IsOpened() const
{
return m_bOpened;
}
```
这里只需要返回 m_bOpened 即可。
至此,我们就完成了一个简单的自定义串口类。可以通过实例化这个类来进行串口通信的操作,具体使用方法可以参考下面的示例代码:
```c++
int main()
{
SerialPort port;
if (!port.Open(1, 9600)) {
return -1;
}
char buffer[1024];
while (true) {
int bytesRead = port.ReadData(buffer, sizeof(buffer));
if (bytesRead > 0) {
buffer[bytesRead] = '\0';
std::cout << buffer << std::endl;
}
}
port.Close();
return 0;
}
```
在这个示例中,我们首先实例化了一个 SerialPort 类,并通过 Open 函数打开了 COM1 号串口。然后,我们通过 ReadData 函数从串口读取数据,并将读取的数据打印到控制台上。最后,我们通过 Close 函数关闭了串口。