asp.net C#串口通信详解

标准DLL,可以采用DllImport进行调用。例如:

 代码如下 复制代码

  [DllImport("KMY350X.dll")]
        private static extern int OpenPort(int PortNum, int BaudRate);

如果一些厂家比较懒的话,没有提供相应的dll,我们只能对它进行串口通信编程了。以前从没接触过串口编程,最近在一个项目中有几个地方都需要采用串口通信,跟公司一个老手请教后,感觉学到了很多东西,特在此做个总结:

     

      一:首先我们来认识下什么是串口:

右键 我的电脑-管理-设备管理器-端口,选择一个端口,点击属性。

        

 

我们可以看到该串口的属性,在C#中我们使用SerialPort类来表示串口

       

 代码如下 复制代码

    ConfigClass config = new ConfigClass();
    comm.serialPort.PortName = config.ReadConfig("SendHealCard");
            //波特率
            comm.serialPort.BaudRate = 9600;
            //数据位
            comm.serialPort.DataBits = 8;
            //两个停止位
            comm.serialPort.StopBits = System.IO.Ports.StopBits.One;
            //无奇偶校验位
            comm.serialPort.Parity = System.IO.Ports.Parity.None;
            comm.serialPort.ReadTimeout = 100;
            comm.serialPort.WriteTimeout = -1;

 

        二:串口调试工具:

在对串口进行编程时候,我们要向串口发送指令,然后我们解析串口返回的指令。在这里向大家推荐一款工具。

        串口调试助手.exe

        

         

 

将要发送的指令用空格隔开,选择HEX显示为放回的字符串。

       

三:正式编程:

       

 代码如下 复制代码

编写Comm类:

     public class Comm   
     {
        public delegate void EventHandle(byte[] readBuffer);
        public event EventHandle DataReceived;

        public SerialPort serialPort;
        Thread thread;
        volatile bool _keepReading;

        public Comm()
        {
            serialPort = new SerialPort();
            thread = null;
            _keepReading = false;
        }

        public bool IsOpen
        {
            get 
            {
                return serialPort.IsOpen;
            }
        }        

        private void StartReading()
        {
            if (!_keepReading)
            {
                _keepReading = true;
                thread = new Thread(new ThreadStart(ReadPort));
                thread.Start();
            }
        }

        private void StopReading()
        {
            if (_keepReading)
            {
                _keepReading = false;
                thread.Join();
                thread = null;                
            }
        }

        private void ReadPort()
        {
            while (_keepReading)
            {
                if (serialPort.IsOpen)
                {
                    int count = serialPort.BytesToRead;
                    if (count > 0)
                    {
                        byte[] readBuffer = new byte[count];
                        try
                        {
                            Application.DoEvents();
                            serialPort.Read(readBuffer, 0, count);
                            if(DataReceived != null)
                                DataReceived(readBuffer);
                            Thread.Sleep(100);
                        }
                        catch (TimeoutException)
                        {
                        }
                    }
                }
            }
        }

        public void Open()
        {
            Close();            
            serialPort.Open();
            if (serialPort.IsOpen)
            {
                StartReading();
            }
            else
            {
                MessageBox.Show("串口打开失败!");
            }
        }

        public void Close()
        {
            StopReading();
            serialPort.Close();
        }

        public void WritePort(byte[] send, int offSet, int count)
        {
            if (IsOpen)
            {
                serialPort.Write(send, offSet, count);
            }
        }
    }

   

注册串口:

     

     

 代码如下 复制代码

      Comm  comm = new Comm();
            ConfigClass config = new ConfigClass();
            comm.serialPort.PortName = config.ReadConfig("SendHealCard");
            //波特率
            comm.serialPort.BaudRate = 9600;
            //数据位
            comm.serialPort.DataBits = 8;
            //两个停止位
            comm.serialPort.StopBits = System.IO.Ports.StopBits.One;
            //无奇偶校验位
            comm.serialPort.Parity = System.IO.Ports.Parity.None;
            comm.serialPort.ReadTimeout = 100;
    comm.serialPort.WriteTimeout = -1; 
     
      comm.Open();

            if (comm.IsOpen)

            {

                comm.DataReceived += new Comm.EventHandle(comm_DataReceived);

            }

发送指令:

      

        /// <summary>
/// 发卡到机口
        /// </summary>
        private void SendCardToOut()
        {
            is_read_card = false;
            sendCardToOut = true;
            byte[] send = { 0x02, 0x46, 0x43, 0x34, 0x03, 0x30 };
            if (comm.IsOpen)
            {
                comm.WritePort(send, 0, send.Length);
            }
        } 

收到指令,并解析:

     

          void comm_DataReceived(byte[] readBuffer1)
 {
            //log.Info(HexCon.ByteToString(readBuffer));
            if (readBuffer1.Length == 1)
            {
                receive = HealCardClass.ByteToString(readBuffer1);
                string str = "06";
                if (string.Equals(receive.Trim(), str, StringComparison.CurrentCultureIgnoreCase))
                {
                    try
                    {
                        if (is_read_card)
                        {
                            byte[] send = new byte[1];
                            send[0] = 0x05;
                            comm.WritePort(send, 0, send.Length);
                            Thread.Sleep(500);
                            comm.DataReceived -= new Comm.EventHandle(comm_DataReceived);
                            InitReadComm();
                        }
                        if (sendCardToOut)
                        {
                            byte[] send = new byte[1];
                            send[0] = 0x05;
                            comm.WritePort(send, 0, send.Length);

                            readComm.DataReceived -= new Comm.EventHandle(readComm_DataReceived);
                            readComm.Close();

                            log.Info("发卡完成!");
                            lblMsg.Text = "发卡成功!";
                            lblSendCardMsg.Text = "发卡完成,请收好卡!";
                            timer1.Tick -= new EventHandler(timer1_Tick);
                            PlaySound();
                            this.btnOK.Enabled = true;

                        }
                    }
                    catch (Exception ex)
                    {
                        log.Info(ex.ToString());
                    }
                }
            }
  } 

时间: 2024-09-04 12:01:13

asp.net C#串口通信详解的相关文章

使用JAVA实现http通信详解_java

Http通信概述 Http通信主要有两种方式POST方式和GET方式.前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符.但是GET请求并不是一无是处--GET请求大多用于查询(读取资源),效率高.POST请求用于注册.登录等安全性较高且向数据库中写入数据的操作. 除了POST和GET,http通信还有其他方式!请参见http请求的方法 编码前的准备 在进行编码之前,我们

转:ASP.NET验证控件详解

asp.net|控件|详解 ASP.NET验证控件详解 ASP.NET是微软推出的下一代WEB开发工具,其强大的功能立即吸引了一大批WEB开发者投入它的靡下.现在,我们来看看ASP.NET的验证控件,感受ASP.NET的强大功能同时方便我们现在的WEB开发. WEB开发者特别是ASP开发者,一直对数据验证比较恼火,当你好不容易写出数据提交程序的主体以后,还不得不花大把时间去验证用户的每一个输入是否合法.如果开发者熟悉JavaScript或者VBScript,可以用这些脚本语言轻松实现验证,但是又

Android Socket通信详解_Android

一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过

asp 内置对象 Application 详解

asp内置对象 Application 详解  在 ASP 的内建对象中除了用于发送.接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象.  让我们先来看看 Application 对象.在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序.我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据.而且,Application 对象还有控制访问应用层数据的方法

asp 内置对象 Application 详解_ASP基础

asp内置对象 Application 详解  在 ASP 的内建对象中除了用于发送.接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象.  让我们先来看看 Application 对象.在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序.我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据.而且,Application 对象还有控制访问应用层数据的方法

ASP中FormatDateTime函数用法详解

FormatDateTime 函数 返回表达式,此表达式已被格式化为日期或时间. FormatDateTime(Date[, NamedFormat]) 参数 参数 描述 date Required. Any valid date expression (like Date() or Now()) 必选项.要被格式化的日期表达式.(如Date()或Now()) format Optional. A Format value that specifies the date/time format

ASP实例之计数器程序详解

程序|计数器|详解   Active Server Pager(动态服务器主页,简称ASP),通过读写服务器的文件,结合script语言(VBscript或Jscript)和html码可以方便地实现页面计数器功能.现流行的ASP教材和网络上的ASP教程都谈到过ASP计数器的设计问题,但是都过于简单,比如没有提到怎样实现计数器脚本和主页面的分离以及图象计数器的实现等.下面就作者为单位制作NT web站点的经验,举实例循序渐进谈谈关于ASP计数器的设计,希望能给ASP的初学者和对ASP WEB编程有

ASP开发中存储过程应用详解

存储过程|详解 ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过.我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事.对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了. 现在,我基本上通过调用存储过程访问SQL Server,以下的文字都是实践的总结,希望对大家能有帮助. 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 定义总是很

ASP内置对象ObjectContext详解

object|对象|内置对象|详解     您可以使用 ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事务,它由 ASP 页包含的脚本初始化.      ASP 包含 @TRANSACTION 指令时,该页会在事务中运行,直到事务成功或失败后才会终止.      语法   ObjectContext.method      方法   SetComplete SetComplete 方法声明脚本不了解事务未完成的原因.