c# 串口通信

直接上代码:

需要注意的点:

1: 如果通过设备定义了握手协议,那么就要给SerialPort .Handshake设定握手协议

2:serialPort.RtsEnable = true;  具体情况设置(什么作用自行百度)

3:Post_DataReceived中,快速连续使用readLine()会抛异常,未能解决

using System;
using System.Diagnostics;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace TPCL.Port
{
    class RS232
    {
        private SerialPort serialPort = null;
        public delegate void ReceiveDataHandle(byte[] Data);   //委托,接受数据处理
        public event ReceiveDataHandle EventReceiveDataHandle;
        private StringBuilder builder = new StringBuilder();
        public bool Open(string portname, int baudRate, Parity parity, int dataBits, StopBits stopBit, Handshake handShake)
        {
            try
            {
                if (this.serialPort == null || this.serialPort.IsOpen == false)
                {
                    serialPort = new SerialPort(portname, baudRate, parity, dataBits, stopBit);
                    serialPort.Handshake = handShake;
                    serialPort.WriteTimeout = 3000;
                    serialPort.ReadTimeout = 3000;
                    serialPort.ReceivedBytesThreshold = 1;
                    //serialPort.RtsEnable = true;
                    serialPort.Open();
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(Post_DataReceived);//串口接收处理函数
                    return this.serialPort.IsOpen;
                }
                else
                    return this.serialPort.IsOpen;
            }
            catch (Exception)
            {
                this.Close();
                return false;
            }
        }

        public void Close()
        {
            if (this.serialPort != null)
                this.serialPort.Close();
        }

        public int Send(string Data)
        {
            try
            {
                if (this.serialPort.IsOpen)
                {
                    serialPort.DiscardInBuffer();       //清除接收缓冲区数据
                    serialPort.DiscardOutBuffer();        //清除传输缓冲区数据
                    byte[] data = Encoding.GetEncoding("GBK").GetBytes(Data.Trim() + "\r\n"); //打印机支持GBK中文
                    serialPort.Write(data, 0, data.Length);//写数据
                    return 0;
                }
                else
                {
                    return 1;
                }
            }
            catch (Exception)
            {
                return 2;
            }
        }

        //接受自动触发,通过委托,传递给外部使用
        private void Post_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            /*
            Debug.WriteLine("-----------------read");
            //字节读取,最好定义包头和包尾,避免读取数据只读了一部分
            int DataLen = this.serialPort.BytesToRead;
            byte[] ReDatas = new byte[DataLen];
            serialPort.Read(ReDatas, 0, ReDatas.Length);
                                                                                 
            if (this.EventReceiveDataHandle != null)
                this.EventReceiveDataHandle(ReDatas);
            */

            
            //字符串读取
            string Data = this.serialPort.ReadLine();
            //string Data = this.serialPort.ReadExisting();
            if (this.EventReceiveDataHandle != null)
                this.EventReceiveDataHandle(System.Text.Encoding.ASCII.GetBytes(Data));
                
        }
                             
        //手动获取数据
        public byte[] Read()
        {
            try
            {
                Thread.Sleep(1000);
                byte[] ReDatas = new byte[serialPort.BytesToRead];
                serialPort.Read(ReDatas, 0, ReDatas.Length);
                return ReDatas;
            }
            catch (Exception e)
            {
                return System.Text.Encoding.ASCII.GetBytes(e.Message);
            }
        }

        public string ReadLine()
        {
            try
            {
                Thread.Sleep(1000);
                return serialPort.ReadLine();  
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        public bool IsOpen()
        {
            return this.serialPort.IsOpen;
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值