【计算机通讯】VS2015+CnComm串口通讯+实例开发

 

参考博文:
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 <iostream>  
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<iostream>

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) 

 

 

不容易啊!

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值