串口数据通信

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Threading.Tasks;

namespace ComPortApp
{
    public partial class FrmMain : Form
    {private List<byte> buffer = new List<byte>();

        public FrmMain()
        {
            InitializeComponent();
            BindPortName();
            this.tsbtnRead.Click += new EventHandler(tsbtnRead_Click);
            this.tsbtnStop.Click += new EventHandler(tsbtnStop_Click);
            this.tsbtnSend.Click += new EventHandler(tsbtnSend_Click);

            this.tstxtPort.Text = "9600";
        }

        void tsbtnSend_Click(object sender, EventArgs e)
        {
            var text = this.rtxtSend.Text.Trim();
            var bytes = StringToBytes(text);
            if (bytes == null)
            {
                WritePortData(bytes);
            }

            //WritePortData(text);
        }

        void tsbtnStop_Click(object sender, EventArgs e)
        {
            if (serialPort != null)
            {
                serialPort.Close();
            }

            BtnReadEnabled(true);
        }

        private SerialPort serialPort;

        void tsbtnRead_Click(object sender, EventArgs e)
        {
            if (serialPort != null)
            {
                serialPort.Close();
            }

            if (this.tscbxName.SelectedItem == null || string.IsNullOrEmpty(this.tscbxName.SelectedItem.ToString()))
            {
                MessageBox.Show("请选择串口!");
                return;
            }

            var name = this.tscbxName.SelectedItem.ToString();
            if (string.IsNullOrEmpty(name))
            {
                MessageBox.Show("串口名称不能为空!");
                return;
            }

            int baudRate = 0;
            string sBaudRate = this.tstxtPort.Text.Trim();
            if (!int.TryParse(sBaudRate, out baudRate))
            {
                MessageBox.Show("波特率填写错误!");
                return;
            }

            BtnReadEnabled(false);
            BeginReadCom(name, baudRate);
        }

        private void WritePortData(byte[] bytes)
        {
            if (serialPort != null && serialPort.IsOpen)
            {
                serialPort.Write(bytes, 0, bytes.Length);
            }
        }

        public void WritePortData(string text)
        {
            if (serialPort != null && serialPort.IsOpen)
            {
                serialPort.Write(text);
            }
        }

        private void BeginReadCom(string name, int baudRate)
        {
            Task task = new Task(() =>
            {
                serialPort = new SerialPort() { PortName = name, BaudRate = baudRate };
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);

                try
                {
                    serialPort.Close();
                    System.Threading.Thread.Sleep(2000);
                    serialPort.Open();
                    SetData("打开端口成功!\r\n");
                }
                catch (Exception ex)
                {
                    SetData(string.Format("打开端口失败!{0}\r\n", ex.Message));
                }
            });

            task.ContinueWith((t) =>
            {
                if (t.Exception != null)
                {
                    SetData("\r\n" + t.Exception.Message);
                }
            });

            task.Start();
        }

        void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //开始读取相应的数据
            SerialPort sp = sender as SerialPort;
            //获取可读取数据长度
            if (sp.BytesToRead > 0)
            {
                //读取数据
                var readBytes = new byte[sp.BytesToRead];
                sp.Read(readBytes, 0, readBytes.Length);
                buffer.AddRange(readBytes);
                SetData(Program.ToHexString(readBytes));
                byte[] remainingBytes = null;
                var parser = new TempParser();
                parser.NewRequestArrive += new EventHandler<PacketRequest<BSurgarPacket>>(parser_NewRequestArrive);
                parser.ParsePacket(buffer.ToArray(), ref remainingBytes);
                buffer = new List<byte>(remainingBytes);
            }
        }

        private int index = 1;

        void parser_NewRequestArrive(object sender, PacketRequest<BSurgarPacket> e)
        {
            ShowParseResult(string.Format("记录数:{0},{1}\r\n", index, e.Packet.ToString()));
            index++;
        }

        private void ProcessData()
        {

        }

        private void SetData(string data)
        {
            if (this.rtxtData.InvokeRequired)
            {
                this.Invoke((MethodInvoker)(() =>
                {
                    this.rtxtData.Text += data.ToString();
                }));
            }
            else
            {
                this.rtxtData.Text += data.ToString();
            }
        }

        private void BtnReadEnabled(bool isEnabled)
        {
            if (this.toolStrip1.InvokeRequired)
            {
                this.toolStrip1.Invoke((MethodInvoker)(() =>
                {
                    this.tsbtnRead.Enabled = isEnabled;
                }));
            }
            else
            {
                this.tsbtnRead.Enabled = isEnabled;
            }
        }

        private void ShowParseResult(string result)
        {
            if (this.rtxtPacket.InvokeRequired)
            {
                this.rtxtPacket.Invoke((MethodInvoker)(() =>
                {
                    this.rtxtPacket.Text += result;
                }));
            }
            else
            {
                this.rtxtPacket.Text += result;
            }
        }

        public void BindPortName()
        {
            var names = SerialPort.GetPortNames();
            if (names == null || names.Length <= 0)
            {
                return;
            }

            foreach (var n in names)
            {
                this.tscbxName.Items.Add(n);
            }

            this.tscbxName.SelectedItem = this.tscbxName.Items[0];
        }

        public byte[] StringToBytes(string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                return null;
            }

            string[] sBytes = text.Split(' ');
            List<byte> list = new List<byte>();
            try
            {
                foreach (var b in sBytes)
                {
                    list.Add(Convert.ToByte(b, 16));
                }

                return list.ToArray();
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                return null;
            }
        }
    }
}
简单的串口通信,凑合着看吧
posted @ 2015-06-22 15:35  乱7八糟  阅读(211)  评论(0)    收藏  举报