串口通信类,WPF

摘要:
参考前面的数据,我编写了一个通用串行端口类。字符串发送类型使用两种方法,char[]和byte[];数据接收还采用两种字符[]和字节[]。

参考之前的资料,写了一个自己常用的串口类,

字符串发送类型用了两种方式,char[] 和byte[] ;

数据接收也是采用两种 char[] 和byte[] 两种。

类代码贴出来:

 public class SerialPortManager
    {
        private bool _recStaus = true;//接收状态字
        private bool _comPortIsOpen;
        private void SetAfterClose()//成功关闭串口或串口丢失后的设置
        {
            _comPortIsOpen = false;//串口状态设置为关闭状态 
        }
        private void SetComLose()//成功关闭串口或串口丢失后的设置
        {
            SetAfterClose();//成功关闭串口或串口丢失后的设置
        }
        public SerialPort CurrentSerialPort { get; set; } = new SerialPort();
        public byte[] ReceivedDataPacket { get; set; }

        public bool OpenSerialPort(SerialPort serialPortPara)
        {
            CurrentSerialPort = serialPortPara;
            if (_comPortIsOpen == false) //ComPortIsOpen == false当前串口为关闭状态,按钮事件为打开串口
            {
                try //尝试打开串口
                {
                    CurrentSerialPort.ReadTimeout = 8000; //串口读超时8秒
                    CurrentSerialPort.WriteTimeout = 8000; //串口写超时8秒,在1ms自动发送数据时拔掉串口,写超时5秒后,会自动停止发送,如果无超时设定,这时程序假死
                    CurrentSerialPort.ReadBufferSize = 1024; //数据读缓存
                    CurrentSerialPort.WriteBufferSize = 1024; //数据写缓存
                    CurrentSerialPort.DataReceived += ComReceive; //串口接收中断
                    CurrentSerialPort.Open();
                    _comPortIsOpen = true; //串口打开状态字改为true                 
                }
                catch (Exception exception) //如果串口被其他占用,则无法打开
                {
                    _comPortIsOpen = false;
                    ReceiveCompleted = false;
                    throw new Exception("unable open serial port" + exception.Message);
                }
                return true;
            }
            return true;
        }

        public char[] ReceivedDataPacketChar { get; set; }
        public bool ReceiveCompleted { get; set; }

        private void ComReceive(object sender, SerialDataReceivedEventArgs e)
        {
            ReceiveCompleted = false;
            if (_recStaus) //如果已经开启接收
            {
                try
                {
                    Thread.Sleep(50);
                    ReceivedDataPacket = new byte[CurrentSerialPort.BytesToRead];
                    ReceivedDataPacketChar = new char[CurrentSerialPort.BytesToRead];
                    // change to char datas 
                    if (ByteMode)
                    {
                        CurrentSerialPort.Read(ReceivedDataPacket, 0, ReceivedDataPacket.Length);
                    }
                    else
                    {
                        CurrentSerialPort.Read(ReceivedDataPacketChar, 0, CurrentSerialPort.BytesToRead);
                    }
                    ReceiveCompleted = true;
                }
                catch (Exception)
                {
                    if (CurrentSerialPort.IsOpen == false) //如果ComPort.IsOpen == false,说明串口已丢失
                    {
                        SetComLose(); //串口丢失后相关设置
                    }
                    else
                    {
                        throw new Exception("unable to receive data");
                    }
                }
            }
            else //暂停接收
            {
                CurrentSerialPort.DiscardInBuffer(); //清接收缓存
            }
        }

        public bool SendDataPacket(string dataPacket)
        {
            char[] dataPacketChar = dataPacket.ToCharArray();
            return SendDataPacket(dataPacketChar);
        }

        public bool SendDataPacket(byte[] dataPackeg)
        {
            try
            {
                ByteMode = true;
                CurrentSerialPort.Write(dataPackeg, 0, dataPackeg.Length);

            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
                return false;
            }
            return true;
        }

        public bool CloseSerialPort()
        {
            try//尝试关闭串口
            {
                CurrentSerialPort.DiscardOutBuffer();//清发送缓存
                CurrentSerialPort.DiscardInBuffer();//清接收缓存
                //WaitClose = true;//激活正在关闭状态字,用于在串口接收方法的invoke里判断是否正在关闭串口
                CurrentSerialPort.Close();//关闭串口
                                          // WaitClose = false;//关闭正在关闭状态字,用于在串口接收方法的invoke里判断是否正在关闭串口
                SetAfterClose();//成功关闭串口或串口丢失后的设置
                _comPortIsOpen = false;
            }
            catch//如果在未关闭串口前,串口就已丢失,这时关闭串口会出现异常
            {
                if (CurrentSerialPort.IsOpen == false)//判断当前串口状态,如果ComPort.IsOpen==false,说明串口已丢失
                {
                    SetComLose();
                }
                else//未知原因,无法关闭串口
                {
                    throw new Exception("unable close serial port");
                }
            }
            return true;
        }

        public bool ByteMode { get; set; }

        public bool SendDataPacket(char[] senddata)
        {
            try
            {
                ByteMode = false;
                CurrentSerialPort.Write(senddata, 0, senddata.Length);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
                return false;
            }
            return true;
        }
    }

调用方法:char[]

 private SerialPortManager _serialPortManager = new SerialPortManager();
char[] bytes ={(char)0xAA,(char)0xFF,(char)0x55,
                (char)0xff, (char)0x06, (char)0x20,
                (char)0xAA,(char)0XEE,(char)0x55,(char)0xEE};
            _serialPortManager.SendDataPacket(bytes);

byte[]

byte[] byteOrdor = new byte[]
            {
                0xAA,0XFF,0X55,
                0XFF,0X06,0X20,0XAA,0XEE,0X55,0XEE
            };
            _serialPortManager.SendDataPacket(byteOrdor);

数据接收数组对应使用 

public byte[] ReceivedDataPacket { get; set; }
public char[] ReceivedDataPacketChar { get; set; }

实际可用。

免责声明:文章转载自《串口通信类,WPF》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu上安装ffmpegdocker 安装 activemq下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF入门教程系列一——基础

WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列六——布局介绍与Canvas(一) WPF入门教程系列七——布局之WrapPanel与StackPanel(二)...

Linux网络编程笔记(修订版)

我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1.   基本概念 2.   基本接口 2.1.   打开一个socket 2.2.   将socket绑定定指定的端口—bind 2.3.   侦听socket—listen (服务器端) 2.4.   等待接收请求—accept (服务器端) 2...

C#探秘系列(九)WPF连接Mysql数据库

两个函数即可搞定: private void GetData() { MySqlConnection connection = new MySqlConnection(myConnectionString); connection.Open(); if (conn...

项目笔记---WPF之Metro风格UI

写在前面   作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃。   切入正题,本文来自于一个项目的Demo演示版,当然为了做到“Cool”我选择了WPF作为项目的概念版进行演示,所用到包括大名鼎鼎的MahApps.Metro以及...

「雕爷学编程」Arduino动手做(33)——ESP-01S无线WIFI模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。 【Arduino】108种传感器模块系列实验(资料+代...

socket选项总结(setsocketopt)

功能描述:        获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TC...