vs2013封装串口库并虚拟串口测试使用

一、环境:
vs2013;vspd
安装下下面这个软件:功能是提供虚拟串口的功能:叫vspd直接网上搜索下载就可以。

二、创建dll工程

名字啥的可以自己起。
创建完之后会自动生成一些东西,我们只需要在我们的项目cpp文件编写我们所需要的代码函数和接口就可以,头文件的.h文件去进行声明即可。
我实现的是在dll中生成一个串口接口,然后在新建的exe项目中去进行接口调用测试。
下面是我的主要实现函数:

/定义数据帧
int checkStatus(char * buf){
	string res;
	char sub[20];
	substring(buf, 'E', 'X', sub);
	char *p = sub;
	res = p;
	cout << res.c_str() << endl;

	char* senddata;
	string k1 = res.substr(1, 2);    //第一个继电器状态码
	//cout << k1.c_str() << endl;
	string k2 = res.substr(4, 2);           //第二个继电器状态码
	string k3 = res.substr(7, 2);           //第三个继电器状态码
	string k4 = res.substr(10, 2);          //第四个继电器状态码
	string k5 = res.substr(13, 2);          //校验位加和
	string kk = k1 + k2 + k3 + k4;
	//senddata = "01";
	//gCom.write(senddata, strlen(senddata));
	//判断操作
	if (strcmp((const char*)k1.c_str(), "01") && strcmp((const char*)k5.c_str(), (const char*)kk.c_str())){//控制继电器1开
		senddata = "01";
		gCom.write(senddata, strlen(senddata));
	}
	return 1;
}
int ControlRelay(int id, char* controldata){
	//gCom.write(controldata,strlen(controldata));
	checkStatus(controldata);//判断数据帧
	return 1;
}

写完之后我们点击生成dll就可以了。

然后就是再新建一个exe刚才项目来调用测试我们刚才的接口,看看能不能正常使用。

下面是我的测试接口代码:

#include<iostream>
using namespace std;
//将export改为import即导出变导入即可
#include <stdio.h>
#include <string.h>
#include <time.h>

extern "C"_declspec(dllimport) int maopao(int a, int b);
extern "C"_declspec(dllimport) int ControlRelay(int id, char* controldata);//继电器控制
extern "C"_declspec(dllimport) int UartInit(int nCom);
extern "C"_declspec(dllimport) void UartClose(void);
/*
前两位:包头
第三位:板子编号
第四-七位:继电器状态码。
00 00 00 01:表示四号继电器开
00 00 00 00:表示全部继电器关
第八位:校验位:为继电器状态码加和
*/
char toSendUartData[] = "FF,FE,01,01,00,00,01,XF"; 

void substring(char *s, char ch1, char ch2, char *substr)
{
	while (*s && *s++ != ch1);
	while (*s && *s != ch2) *substr++ = *s++;
	*substr = '\0';
}
// 定义一个延时xms毫秒的延时函数
void delay(unsigned int xms)  // xms代表需要延时的毫秒数
{
	unsigned int x, y;
	for (x = xms; x>0; x--)
	for (y = 110; y>0; y--);
}
int main()

{
	//maopao(5, 10);
	string res;
	char sub[20];
	UartInit(2);
	for (int i=0; i < 10; i++)
	{
		ControlRelay(1, toSendUartData);
		delay(1000);
	}
	substring(toSendUartData, 'E', 'X', sub);
	string result;
	char *p = sub;
	res = p;
	cout << res.c_str() << endl;
	string k1 = res.substr(1,2);    //第一个继电器状态码
	cout << k1.c_str() << endl;
	result = k1;
	string k2 = res.substr(4, 2);           //第二个继电器状态码
	cout << k2.c_str() << endl;
	result += k2;
	string k3 = res.substr(7, 2);           //第三个继电器状态码
	cout << k3.c_str() << endl;
	result += k3;
	string k4 = res.substr(10, 2);          //第四个继电器状态码
	cout << k4.c_str() << endl;
	result += k4;
	string k5 = res.substr(13, 2);          //校验位加和
	cout << "k5:"<<k5.c_str() << endl;
	cout <<"检验和:"<< result.c_str() << endl;
	if (strcmp((const char*)k1.c_str(), "01") && strcmp((const char*)res.c_str(), (const char*)k5.c_str())){
		cout << "open sucess!" << endl;
	}
	else
	{
		cout << "open error!" << endl;
	}
	system("pause");
	return 0;

}

配置环境:

在VS工程中,添加c/c++工程中外部头文件及库的基本步骤:

1、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。

2、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。
     然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。

3、添加工程引用的dll动态库:把引用的dll放到工程的可执行文件所在的目录下。

注意:第一步可以不用,直接在工程里加入动态库的头文件,在使用代码处引用这个头文件。

之后点击运行:
打开我们的出口调试助手就可以看到发送的数据了。

资源文件稍后会整理上传。
错误解决:
1.VS2013 新建工程 出现错误 “未将对象引用设置到对象的实例”?
打开vs工具,进入命令模式

输入:devenv /ResetSettings,在重新打开你的项目就可以解决。
2.出现无法定位程序xxx与动态链接库上?
双击项目,在文件资源管理器打开,
要把你的dll文件生成的lib和dll文件复制到你的exe同一目录下才不会报错。

posted @ 2020-07-30 09:12  jee-cai  阅读(198)  评论(0编辑  收藏  举报