c#串口通信讲解(一)(winform、wpf)

串口操作需要注意的几点如下:

1、如果是USB转串口;则需要安装USB转串口驱动,附件有此驱动。

2、串口打开状态最好不要直接插拔串口,可能会导致中控板或者串口线烧坏。

3、使用串口调试工具CEIWEI,下一章节会贴上使用教程

简单的串口收发通信,有以下步骤:

1、打开制定的串口、绑定串口接收事件

2、初始化串口指令

3、发送串口指令

-------打开串口代码--------

/// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="strPortName">串口号</param>
        /// <param name="nRate">波特率</param>
        /// <param name="nDataBit">数据位</param>
        /// <param name="stopBits">停止位</param>
        /// /// <param name="nParity">校验位</param>
        /// <returns></returns>
        public bool OpenSerial(string strPortName, int nRate, int nDataBit, float nStopBits, int nParity)
        {
            //这里就是绑定串口接收回调事件,即发送一条串口命令,发送成功,则会触发此事件进入ReciceSerialData方法,我们就进行判断发送成功还是失败。
            serial.DataReceived += new SerialDataReceivedEventHandler(ReciveSerialData);
            serial.PortName = strPortName;//串口号
            serial.BaudRate = nRate;//波特率
            float f = nStopBits;//停止位
            if (f == 0)
            {
                serial.StopBits = StopBits.None;
            }
            else if (f == 1.5)
            {
                serial.StopBits = StopBits.OnePointFive;
            }
            else if (f == 1)
            {
                serial.StopBits = StopBits.One;
            }
            else
            {
                serial.StopBits = StopBits.Two;
            }

            serial.DataBits = nDataBit;//数据位
            if (nParity == 0) //校验位
            {
                serial.Parity = Parity.None;
            }
            else if (nParity == 1)
            {
                serial.Parity = Parity.Odd;
            }
            else if (nParity == 2)
            {
                serial.Parity = Parity.Even;
            }
            else
            {
                serial.Parity = Parity.None;
            }

            serial.ReadTimeout = 3000;//设置超时读取时间
            serial.WriteTimeout = 500;//超时写入时间
            try
            {
                if (!serial.IsOpen)
                {
                    serial.Open();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return false;
            }

            return true;

        }

 -------使用实例--------

//定义串口对象
private SerialPort serial = new SerialPort();

//在按钮Click事件里调用打开串口的方法,串口COM号参数以本机具体串口号为准,COM1除外,如果只有COM1则需要安装串口驱动,见附件
private void btnOpenSerial_Click(object sender, EventArgs e)
        {
            if (!OpenSerial("COM3", 115200, 8, 1, 0))
            {
                //串口打开失败
                MessageBox.Show("串口打开失败!");
            }
        }

-------初始化串口命令、发送指令-------

注:我这个命令并不是通用的,是根据我这边的中控板协议;发对应的命令,但是其他中控板的命令格式也是差不多的

   /// <summary>
       /// 初始化串口命令
       /// </summary>
       /// <param name="nStaus">操作类型</param>
        public void InitialSerialCommand(int nStaus)
        {
            byte[] btyData = new byte[100];
            btyData[0] = 0x5A;
            btyData[1] = 0x55;
            btyData[2] = 0x00;
            btyData[3] = 0x00;
            btyData[4] = 0x02;
            btyData[5] = 0xD1;
            btyData[6] = 0x00;
            btyData[7] = 0x18;
            btyData[8] = 0x6A;
            btyData[9] = 0x69;

            //开灯
            if (nStaus == 0)
            {
                btyData[6] = 0x01;
            }
            //全关
            else
            {
                btyData[6] = 0x00;
            }

            //发送指令
            if (serial != null)
            {
                try
                {
                    SerialWrite(0, btyData);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }

---------串口回调方法-----------

        /// <summary>
        /// 接收数据事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ReciveSerialData(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                if (serial.BytesToRead == 0)
                {
                    return;
                }
                byte[] btyReciveData = new byte[serial.BytesToRead];
                byte[] btyResoureData = new byte[btyReciveData.Length];
                string strData = string.Empty;
                int intSp = serial.Read(btyReciveData, 0, btyReciveData.Length);//在此就可以读取到当前缓冲区内的数据
                int i = 0;
                string[] hex = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
                for (i = 0; i < btyReciveData.Length; i++)
                {
                    btyResoureData[i] = Convert.ToByte(("0x" + (hex[btyReciveData[i] / 16]).ToString() + (hex[btyReciveData[i] % 16]).ToString()), 16);
                }
                for (int a = 0; a < btyReciveData.Length; a++)
                {
                    strData += btyResoureData[a].ToString("X2");
                }

                //若串口命令发送成功,则会返回和发送指令一样的指令,我发送的指令是(5A55000002D101186A69 );返回的也是(5A55000002D101186A69 );则可以判定串口数据交互成功。
                if (strData.IndexOf("5A55000002D101186A69") >= 0)
                {
                    //发送成功
                }                    

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

DEMO实例:https://files.cnblogs.com/files/henryzong/%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1DEMO.zip

串口驱动:https://files.cnblogs.com/files/henryzong/%E4%B8%B2%E5%8F%A3%E9%A9%B1%E5%8A%A8.zip

串口调试工具:https://files.cnblogs.com/files/henryzong/%E4%B8%B2%E5%8F%A3%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7.zip

时间: 2024-10-10 18:21:08

c#串口通信讲解(一)(winform、wpf)的相关文章

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

C#-WinForm 串口通信

C#-WinForm 串口通信 //C# 的串口通信,是采用serialPort控件,下面是对serialPort控件(也是串口通信必备信息)的配置如下代码: serialPort1.PortName = commcomboBox1.Text; serialPort1.BaudRate = int.Parse(baudcomboBox2.Text); serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), efficacycomboBox3

Qt实现串口通信总结

注意: Qt5发布之前,Qt实现串口通信一般是采用第三方类库qextserialport.Qt5发布后自带了QtSerialPort 能够支持串口通信. 1.Qextserialport类介绍 在Qt5之前的版本中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,本文章主要是讲解怎样利用此类实现串口通信. 2.文件下载地址: http://sourceforge.net/projects/qextserialport/files/ 3.文件内容:     3.

13.5 串口通信原理和控制程序

我们前边学串口通信的时候,比较注重的是串口底层时序上的操作过程,所以例程都是简单的收发字符或者字符串.在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果. 本节所提供程序的功能是,通过电脑串口调试助手下发三个不同的命令,第一条指令:buzz on 可以让蜂鸣器响:第二条指令:buzz off 可以让蜂鸣器不响:第三条指令:showstr ,这个命令空格后边,可以

Qt串口通信专题教程

查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 --------------2010年7月8日更新--------------– 网友 赵文杰 使用多线程完成的linux下的串口通信. 下载源码:下载 ------------------------------------- 以下是正文: 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序

三菱PLC 串口通信开发心得经验

三菱PLC 串口通信开发心得 备注: 记得两年前刚开始从事软件开发工作时,第一份任务就是开发一个程序能够实现与三菱PLC 串口通信.所谓通信,其实质主要是对PLC 的D寄存器(dword)读写操作.但是因为日本为了保护其产品,并不开发串口通信协议.在不开发通信协议的情况,如果想实现通信,首先需要做的便是通过数据分析,破解其通信协议. 这里就不讲解如何破解了,主要是介绍下当时博主开发程序的背景. 写这篇博客的主要目的是为了分享过去自己的开发经验,因为自己在开发的过程中曾经接受过很多开源软件的帮助,

C#实现简单的串口通信

前言 本着学习研究的态度,用c#语言实现简单的串口通信工具. 一.串口通信原理 串口通信 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远距离通信.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据.其他线用于握手,但不是必须的.串口通信最重要的参数是波特率.数据位.停止位和奇偶校验.对于两个进行通信的

(转)用C#一步步写串口通信

最近在公司让用C#写一个串口调试的工具,要求向串口中输入16进制数据或字符串.因为我刚到公司,并且对C#也不是很熟悉,针对硬件编程更是从来没接触过,确实耗掉了一些时间.好在一切都可以慢慢来,通过网上查资料,几天工作下来,还是小有成就.下面我就将这次遇到的问题和解决方法奉献出来,目的是和同行交流,回馈网友们提供的帮助,也是为了自己对知识加深一下巩固.      说了一大通废话之后,我们来看具体的实现步骤. 公司要求实现以下几个功能:1):实现两台计算机之前的串口通信,以16进制形式和字符串两种形式

深入理解51单片机串口通信

串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高.以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,类似于8个车道可以过去8辆车,这样的形式是并行的,一般称P0,P1,P2,P3为51单片机的4组并行总线. 串行通信,就是一个车道,一个只能通过一辆车,如果一个0x55这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式是:0-1-0-1-0-1-0-1,一位一位的进行