前言
距离上一次在CSDN正儿八经地写技术文章已经有2年多了,希望来掘金体验的第一篇文章能稍微温一温吧。
首先,感谢 老司机的诗和远方 发表的文章(blog.csdn.net/Touch_Dream…),让本人在GitHub的串口库 WzSerialPort 得到了不少的Fork和Star。
本篇要分享的同样是串口库,但不是 WzSerialPort,而是 WzSerialPortPlus 。
- WzSerialPort: 轮询版本,需要自己开线程来读数据。
- WzSerialPortPlus: 回调版本,无需自己开线程来读数据, Lamda表达式 、 函数指针 、 继承 三种方法选其一即可。
示例代码
前置说明
- vspd: virtual serial port device,使用这个工具,将 COM11 和 COM12 配置成虚拟串口对。
- 以下代码中使用 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;
}
运行结果如下:
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;
}
运行结果如下:
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;
}
运行结果如下:
以上三种方法均可使用 WzSerialPortPlus。