【原】基于vc 6.0开发dll动态链接库和测试实例--串口操作

【原】基于vc 6.0开发dll动态链接库和测试实例--串口操作

 

公司突然下达指令,让我这个从没用过vc的人开发一个接口函数,对接方又比较蛋疼,指定要求将接口封装到dll中进行使用,以下是使用过程中步骤说明以及一点自己的心得

(感谢网上所有开源,讲解的兄弟姐妹以及各位大牛老师们,分享快乐!)

 

1 制作简单的dll

 

1)使用vc 6.0创建一个dll实例

选择win32 dynamiclink library选项创建一个dll实例、


选择a simple dll project模版


点击finish


点击ok会进入工程

 

 

2 代码修改

1)在123.cpp中会出现这样一段代码,对此无需修改

 

#include "stdafx.h"

 

BOOL APIENTRY DllMain( HANDLE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

                                    )

{

    return TRUE;

}

 

2)StdAfx.cpp中,在include下方添加你需要使用的函数名称,格式如下

 

extern "C" __declspec(dllexport) int functionName (int value1, char * value2,char *value3);

 

3)然后添加你需要实现的函数体

int poka_command (int port, char * command,char *read_buf)

{

//这里我需要他实现一个对串口进行读写的功能

HANDLE m_hCom;

       //hCom  = OpenConnection(comPort);

                // 串行口句柄

       int m_nBaud;//数据传输速率

       int m_nDataBits;//数据位

       BOOL m_bEcho;//表明本地回显

       BOOL m_bNewLine;//表明自动换行

       int m_nParity;//校验位

       int m_nStopBits;//停止位

 

       COMMTIMEOUTS TimeOuts;

       DCB dcb;

    m_nBaud = 115200;

       m_nDataBits = 8;

       m_bEcho = FALSE;

       m_bNewLine = FALSE;

       m_nParity = 0;

       m_nStopBits = 0;

       char s[5]="";

    sprintf(s,"COM%d",port);

       m_hCom=CreateFile(s, GENERIC_READ | GENERIC_WRITE, 0, NULL,

              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,

              NULL);                                     // 重叠方式

    if(m_hCom==INVALID_HANDLE_VALUE)

              return 0;

    SetupComm(m_hCom,4096,4096);

    // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作

       TimeOuts.ReadIntervalTimeout=MAXDWORD;

       TimeOuts.ReadTotalTimeoutMultiplier=0;

       TimeOuts.ReadTotalTimeoutConstant=0;

    /* 设置写超时以指定WriteComm成员函数中的GetOverlappedResult函数的等待时间*/

       TimeOuts.WriteTotalTimeoutMultiplier=50;

       TimeOuts.WriteTotalTimeoutConstant=2000;

    SetCommTimeouts(m_hCom, &TimeOuts);

    if(!GetCommState(m_hCom, &dcb))

              return 0;

       dcb.fBinary=TRUE;

       dcb.BaudRate = m_nBaud; // 数据传输速率

      dcb.StopBits = ONESTOPBIT;//1停止位

       dcb.ByteSize = m_nDataBits; // 每字节位数

    dcb.Parity = NOPARITY;                     //无奇偶校验

    if(!SetCommState(m_hCom, &dcb))

       {

              return 0;

       }

   SetCommMask(m_hCom, EV_RXCHAR);

       unsigned long l1;

       char *m_send = "1234";

       WriteFile(m_hCom, m_send,4, &l1, NULL);//发送数据

 

       char str[17]  = {'\0'};

       unsigned long l0;

//     char read_buf[17] = {'\0'};

       int strL=0;//获取字符串长度

       while(1)

       {

              ReadFile(m_hCom,str,16,&l0, NULL);

              if(l0 > 0) //收到数据

              {

                     printf("l0.length = %d",l0);

                     //判断有效数据长度

                    

                     for(int i=0;i<(int)l0;i++)//str中有效数据长度放到str2

                     {

                            read_buf[strL++]=str[i];

                     }

                     printf("ReadFile==%s\n",str);//输出str2

                     printf("ReadFile==%s\n",read_buf);

                     if(strL>15)//判断str2长度是否为16位,是则跳出,否则继续读数据

                            break;

              }

              else{

                     memset(str,0,sizeof(str));

              }

       }

       return 1;

}

 

4 然后点击编译,在debug文件夹下面就有生成好的dll文件了

 

调试:

1)将生成的dll文件拷贝到新建工程的根目录

2)在新建工程的StaAfx.cpp文件中加入

#include "windows.h"

typedef int (*poka_command) (int,char *,char *);

这是加入函数声明以及windows的头文件。

 

3)接下来就是对dll文件的引用,这里选择显式引用

HINSTANCE hDll;

     poka_command myId;

     hDll = LoadLibrary("object.dll");

     if (hDll != NULL)

     {

          printf("hdll ok\n");

          myId = (poka_command)GetProcAddress(hDll,"poka_command");

          if(myId!=NULL)

          {

               printf("myid ok\n");

               char command[20] = {"fdafda"};

               char read_Buf[20]={'\0'};

               int result = myId(3,command,read_Buf);

               printf("\nresult = %d\n",result);

               printf("id = %s ", read_Buf);

          }

          FreeLibrary(hDll);

     }

 

点击运行可以查看结果。。这里我因为有串口外设,所以能看到结果。如果你没有,可以下一个虚拟串口工具, 新建两个关联串口进行调试。

 

这是我开发的步骤,已经验证可以通过,如果有问题,请留言指正,谢谢

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值