参考博文:
https://blog.csdn.net/trustguan/article/details/50598840
https://blog.csdn.net/qing666888/article/details/78435715?locationNum=1&fps=1
这俩位博主发的博文很有参考意义
但是存在很多错误
0. 笔者电脑环境
win10+VS2015+CnComm v1.51 多线程串口通讯库
1. 安装usb转串口驱动:PL2303_Prolific_DriverInstaller_v1.11.0
2. 下载串口助手:USR-TCP232-Test-V1.3(串口以太网调试助手)
以上资源可以在此处下载:(包含usb2串口驱动+串口助手)
https://download.csdn.net/download/jin739738709/11071375
打开之后的样子
参数设置操作
3. 下载“CnComm.h”头文件,引入项目
可以在开头两个博主那里下载,也可以私信笔者
4. 新建win32项目SerialThread
5. 构建继承CnComm类的子类:SerialThread类(要分别编写“SerialThread.h”、"SerialThread.cpp")
首先编写“SerialThread.h”头文件,定义继承自CnComm类的子类:SerialThread类
//SRIALTHREAD_H 头文件标识,避免重复定义,
//和头文件无直接关系,可以随便定义,但一般是文件名的大写
#ifndef SRIALTHREAD_H
#define SRIALTHREAD_H
#include"CnComm.h"
class SerialThread : public CnComm
{
public:
SerialThread();//构建函数,可以为空
virtual ~SerialThread();//解析函数,可以为空
void ThreadInit();//打开串口
void CloseSerialPort(); //关闭串口
void SendDatas(char *msg);//发送数据
void OnReceive(); //接收数据
private:
CnComm Com;//实例化CnComm类
//备用函数,不是必须的
int Ascii2Hex(char* ascii, char* hex); //ascii转十六进制
int Hex2Ascii(char* hex, char* ascii); //十六进制转ascii
};
#endif
然后编写“SerialThread.cpp”具体定义SerialThread类中的方法
#include "SerialThread.h"
#include
using namespace std;
SerialThread::SerialThread()
{
}
SerialThread::~SerialThread()
{
}
void SerialThread::ThreadInit()
{
if (!Com.IsOpen())
{
//CnComm::Open函数就是用来打开串口
//bool Open(DWORD dwPort, LPCTSTR szPortName, DWORD dwBaudRate, BYTE btParity = NOPARITY, BYTE btByteSize = 8, BYTE btStopBits = ONESTOPBIT)
//dwPort,szPortName可以在“计算机管理->设备管理器->端口(COM和LPT)->双击设备名:位置”
if (!Com.Open(7, _T("COM5"), 115200))//
{
cout << "open fail" << endl;
}
}
else {
cout << "already open" << endl;
}
}
void SerialThread::CloseSerialPort()
{
Com.Close();//关闭串口
cout << "Close Successfully!" << endl;
}
void SerialThread::SendDatas(char *msg)
{
if (Com.IsOpen())
{
Com.Write(msg);//写入字符串,实现控制
}
}
void SerialThread::OnReceive()
{
do {
char buffer[1024];
int len = Com.Read(buffer, 1023);//接受字符串
buffer[len] = _T('\0');
cout << buffer << endl;
} while (Com.IsRxBufferMode() && Com.Input().SafeSize());
}
int SerialThread::Ascii2Hex(char* ascii, char* hex)
{
int i, len = strlen(ascii);
char chHex[] = "0123456789ABCDEF";
for (i = 0; i < len; i++)
{
hex[i * 3] = chHex[((BYTE)ascii[i]) >> 4];
hex[i * 3 + 1] = chHex[((BYTE)ascii[i]) & 0xf];
hex[i * 3 + 2] = ' ';
}
hex[len * 3] = '\0';
return len * 3;
}
int SerialThread::Hex2Ascii(char* hex, char* ascii)
{
int len = strlen(hex), tlen, i, cnt;
for (i = 0, cnt = 0, tlen = 0; i < len; i++)
{
char c = toupper(hex[i]);
if ((c >= '0'&& c <= '9') || (c >= 'A'&& c <= 'F'))
{
BYTE t = (c >= 'A') ? c - 'A' + 10 : c - '0';
if (cnt)
ascii[tlen++] += t, cnt = 0;
else
ascii[tlen] = t << 4, cnt = 1;
}
}
return tlen;
}
这里要想用CnComm::Open打开串口,就要找对端口号(port number)和端口名称(port name)
找寻方法:
计算机管理->设备管理器->端口(COM和LPT)->双击设备名:位置
6. 编写“main.cpp”,实例开发
release x86 编译通过!
记得关闭 串口助手,避免它占用端口
#include"SerialThread.h"
#include
using namespace std;
void main() {
SerialThread st;
st.ThreadInit();
char msg[] = {"(send2:0)"};//这是笔者自己的通讯字符格式
st.SendDatas(msg);//发送控制字符
st.OnReceive();//接受回复字符
//st.CloseSerialPort();//关闭串口
system("pause");
}
7. 遇见的错误
【1】error C3688: 文本后缀“L”无效;未找到文文本运算符或文本运算符模板“operator “”“”L”
解决方法:
详情参见:https://blog.csdn.net/qq_29350001/article/details/79994524
解决方法:在字符串里加引号用\
原来宏定义为:
#define CN_ASSERT(E) ((E) ? true : CnComm::Assert(_T(“CN_ASSERT(“)_T(#E)_T(“) failed; CnComm(“)CN_LINE(LINE)_T(“); “)))
修改为:
#define CN_ASSERT(E) ((E) ? true : CnComm::Assert(_T(“CN_ASSERT(\”)_T(#E)_T(\”) failed; CnComm(\”)CN_LINE(LINE)_T(\”); “)))
【2】warning C4996: '_vsnprintf': This function or variable may be unsafe. ......(VS2013)
解决方法:
详情参见:https://blog.csdn.net/hw_henry2008/article/details/6436451
在“CnComm.h”头文件最开始处添加如下代码
#pragma warning(disable:4996)
不容易啊!