C/C++跨平台串口库

1,372 阅读1分钟

前言

距离上一次在CSDN正儿八经地写技术文章已经有2年多了,希望来掘金体验的第一篇文章能稍微温一温吧。

首先,感谢 老司机的诗和远方 发表的文章(blog.csdn.net/Touch_Dream…),让本人在GitHub的串口库 WzSerialPort 得到了不少的Fork和Star。

本篇要分享的同样是串口库,但不是 WzSerialPort,而是 WzSerialPortPlus

  • WzSerialPort: 轮询版本,需要自己开线程来读数据。
  • WzSerialPortPlus: 回调版本,无需自己开线程来读数据, Lamda表达式函数指针继承 三种方法选其一即可。

示例代码

前置说明

  • vspd: virtual serial port device,使用这个工具,将 COM11COM12 配置成虚拟串口对。
  • 以下代码中使用 COM11 ,串口工具XCOM中使用 COM12

1. Lamda表达式方式

#include <iostream>

#include "WzSerialportPlus.h"

int main(int argc,char** argv)
{
    WzSerialportPlus wzSerialportPlus;
    wzSerialportPlus.setReceiveCalback([&](char* data,int length){
        printf("received: %s\n",data);

        std::string responsePrefix = "received: ";
        std::string response(data,length);
        response = responsePrefix + response;

        wzSerialportPlus.send((char*)response.c_str(),response.length());
    });
    if(wzSerialportPlus.open("\\\\.\\COM11",9600,1,8,'n'))
    {
        getchar();
        wzSerialportPlus.close();
    }

    return 0;
}

运行结果如下: image.png

2. 函数方式


#include <iostream>

#include "WzSerialportPlus.h"

WzSerialportPlus wzSerialportPlus;

void callback(char* data, int length)
{
	printf("received: %s\n", data);

	std::string responsePrefix = "received: ";
	std::string response(data, length);
	response = responsePrefix + response;

	wzSerialportPlus.send((char*)response.c_str(), response.length());
}

int main(int argc,char** argv)
{
	std::function<void(char*, int)> f = callback;
    wzSerialportPlus.setReceiveCalback(f);
    if(wzSerialportPlus.open("\\\\.\\COM11",9600,1,8,'n'))
    {
        getchar();
        wzSerialportPlus.close();
    }

    return 0;
}

运行结果如下:

image.png

3. 继承方式


#include <iostream>

#include "WzSerialportPlus.h"

class SerialPort : public WzSerialportPlus
{
protected:
	virtual void onReceive(char* data, int length)
	{
		printf("received: %s\n", data);

		std::string responsePrefix = "received: ";
		std::string response(data, length);
		response = responsePrefix + response;

		this->send((char*)response.c_str(), response.length());
	}
};

int main(int argc,char** argv)
{
	SerialPort serialPort;
    if(serialPort.open("\\\\.\\COM11",9600,1,8,'n'))
    {
        getchar();
		serialPort.close();
    }

    return 0;
}

运行结果如下: image.png

以上三种方法均可使用 WzSerialPortPlus