首页 > 编程语言 >C#调用C++库,进行串口通信

C#调用C++库,进行串口通信

时间:2024-07-18 11:09:49浏览次数:6  
标签:string C# UIntPtr CharSet C++ int 串口 byte dlen

1、添加C++接口实现,将dll放置在运行路径下。

dll文件下载:https://files.cnblogs.com/files/ZM191018/SerialPortLib.7z?t=1721271982&download=true

     [DllImport("SerialPortLib.dll",CharSet=CharSet.Unicode,CallingConvention =CallingConvention.StdCall)]
        static extern int openDevice(string COMName, int dwBaud, string sframe, ref UIntPtr hCom);

        [DllImport("SerialPortLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        static extern int closeDevice(UIntPtr hCom);

        [DllImport("SerialPortLib.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        static extern int startComminication(RECEIVE_CALLBACK receive, byte[] sendData, int dlen, UIntPtr hCom);

2、调用接口打开串口设备

      UIntPtr hCom2 = UIntPtr.Zero;
        private void button3_Click(object sender, EventArgs e)
        {
            string strComName = comboBox1.Text;
            int iBaud = Convert.ToInt32(comboBox2.Text);
            string strFrame = comboBox3.Text;
            try
            {
                int iret = openDevice(strComName, iBaud, strFrame, ref hCom2);
                if (iret == 0)
                {
                    button3.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

3、调用接口将委托作为参数传入,当读取到数据时,进行回调

      public delegate int RECEIVE_CALLBACK(IntPtr recvData, int dlen);
        private void button5_Click(object sender, EventArgs e)
        {
            string sendStr = richTextBox1.Text;
            byte[] sendArr=StringToHexByteArray(sendStr);

            int iret=startComminication(new RECEIVE_CALLBACK(RecvCallBack), sendArr,sendArr.Length, hCom2);
        }

        public int RecvCallBack(IntPtr recvData, int dlen)
        {
            if (recvData != null && dlen > 0)
            {
                byte[] data = new byte[dlen];
                Marshal.Copy(recvData, data, 0, dlen);
                string str = BitConverter.ToString(data, 0, (int)dlen).Replace("-", "");
                this.Invoke((EventHandler)delegate
                {
                    richTextBox2.AppendText(str + "\n");
                    richTextBox2.SelectionStart = richTextBox2.Text.Length;
                    richTextBox2.ScrollToCaret();

                });
                return 0;
            }
            else
            {
                return -1;
            }
        }

4、关闭串口

private void button4_Click(object sender, EventArgs e)
        {
            int iret = closeDevice(hCom2);
            if (iret == 0)
            {
                hCom2 = UIntPtr.Zero;
                button3.Enabled = true;
            }

        }

5、可能用到的方法

     public static byte[] StringToHexByteArray(string hex)
        {
            if (hex.Length % 2 == 1)
                return null;
            int len = hex.Length >> 1;
            byte[] arr = new byte[len];

            for (int i = 0; i < len; ++i)
            {
                arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
            }

            return arr;
        }

        public static int GetHexVal(char hex)
        {
            int val = (int)hex;
            //For uppercase A-F letters:
            // return val - (val < 58 ? 48 : 55);
            //For lowercase a-f letters:
            //return val - (val < 58 ? 48 : 87);
            //Or the two combined, but a bit slower:
            return val - (val < 58 ? 48 : (val < 97 ? 55 : 87));
        }

 6、效果

 

标签:string,C#,UIntPtr,CharSet,C++,int,串口,byte,dlen
From: https://www.cnblogs.com/ZM191018/p/18309059

相关文章

  • windows不下 Docker Desktop 也能部署 docker程序
     可以在Windows上不安装DockerDesktop直接使用Docker服务,但这需要一些额外的设置和配置。以下是一些方法,可以在Windows上实现这种配置。 使用WindowsSubsystemforLinux(WSL2)1、启用WSL2:打开PowerShell并运行以下命令以启用WSL和WSL2:dism.exe/on......
  • html+canvas 实现签名功能
    运行效果代码样例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</t......
  • 程序员常用Mac工具、Idea插件以及Google插件
    1、Typora工具官网地址:https://typoraio.cn/推荐指数:★★★★★作为程序员,Markdown工具肯定是必不可少的,可以用来记录一些技术文档,推荐Typora,整个风格比较简约,自带的样式不太好看,推荐插件typora-theme-pie添加图片注释,不超过140字(可选)2、Termius工具官方地址:https:/......
  • 【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务
    目录0.简介1.环境2.知识点3.详细过程1)创建空项目2)添加Web表单3)使用Web表单的GUI设计4)添加服务引用5)在Web的button函数中调用服务,获取PI值6)测试0.简介本文属于一个系列中的第二篇文章,这个系列会实现一个项目,这个项目主要使用VisualStudio2019作为开发工具,创建WC......
  • Halcon的学习笔记(一)——非线性字符识别
    Halcon非线性模式的字符识别(ocr_cd_print_polar_trans.hdev例程分析)Halcon的学习笔记(一)——非线性字符识别项目上需要对非线性模式的字符进行识别,halcon中包含的例程,我搜了一下,网上对于该例程的解析比较少,因此自己便记录了一下自己的学习例程,也算自己的学习笔记。1.什......
  • 易优CMSartlist 文档列表(配合arcpagelist标签可实现ajax瀑布流分页)
    [基础用法]标签:artlist描述:获取网站栏目(如:文章、产品、图集、软件等)的一些文章。用法:{eyou:artlisttypeid='栏目ID'limit='0,10'flag='c'titlelen='30'infolen='160'orderby='add_time'}<ahref='{$field.arcurl}'&g......
  • 易优CMS模板标签collect文档收藏
    [基础用法]标签:collect描述:文档收藏/取消标签用法:{eyou:collectid="collect"cancel="加入收藏"collect="已收藏"}<a{$collect.onclick}>{$collect.cancel}</a>收藏数:<span{$collect.numId}></span>次{$collect.hidden}{/eyou:c......
  • LangChain补充二:LCEL和Runnable更加方便的创建调用链
    https://www.alang.ai/langchain/101/lc05一:LCEL入门LangChain的设计围绕着让AI应用开发者能够方便地将多个流程连缀成一个AI应用的业务逻辑,包括Chain与Agent。每个流程都被封装成一个runnable(langchain_core.runnables),包括提示语模板、模型调用、输出解析器、工具......
  • 在Linux中,tcp三次握⼿的过程及原理?
    在Linux中,TCP(传输控制协议)的三次握手是建立可靠连接的重要过程。这一机制确保了客户端和服务器之间能够安全、有序地交换数据。下面将详细阐述TCP三次握手的过程及原理:一、TCP三次握手的过程TCP三次握手过程涉及客户端(通常称为“主动打开方”)和服务器(通常称为“被动打开方”)之间......
  • dedecms登陆后台提示“你的用户名不存在“的解决办法
    准备登陆的时候发现出了问题,输入用户名密码验证码点击提交后提示“你的用户名不存在”,多试几次依然如此,第一反应是网站又被黑了?打开网站首页发现正常,点击查看源代码也是正常,好吧,百度之。百度出来的教程各式各样,都不知道是看哪一个好,有说修改php文件的,又说修改数据库的。都觉得有点......