一、环境:
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同一目录下才不会报错。