通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据。这样可以确保每次发送的数据都可以被正确接收。

代码:

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.Ports;
using System.Threading;
using Utils;

namespace 串口通信
{
    public partial class Form1 : Form
    {
        #region 变量
        /// <summary>
        /// 启动还是停止,true起动,false停止
        /// </summary>
        public static bool start = true;
        /// <summary>
        /// 串口资源
        /// </summary>
        private static SerialPort serialPort1 = null;
        /// <summary>
        /// 串口资源
        /// </summary>
        private static SerialPort serialPort2 = null;
        /// <summary>
        /// 成功次数
        /// </summary>
        private static int successCount = 0;
        /// <summary>
        /// 失败次数
        /// </summary>
        private static int errorCount = 0;
        /// <summary>
        /// 上次计算的总次数
        /// </summary>
        private static int lastCount = 0;
        /// <summary>
        /// 定时器
        /// </summary>
        private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        #endregion

        #region Form1
        public Form1()
        {
            InitializeComponent();
        }
        #endregion

        #region Form1_Load
        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1 = new SerialPort("COM1");
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived1);
            serialPort1.Open();
            serialPort2 = new SerialPort("COM2");
            serialPort2.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived2);
            serialPort2.Open();
        }
        #endregion

        #region Form1_FormClosed
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            serialPort1.Close();
            serialPort1.Dispose();
            serialPort2.Close();
            serialPort2.Dispose();
        }
        #endregion

        #region btnStart_Click
        private void btnStart_Click(object sender, EventArgs e)
        {
            start = true;
            SendData();

            timer.Interval = 500;
            timer.Tick += new EventHandler(delegate(object obj, EventArgs eventArgs)
            {
                if (lastCount == 0)
                {
                    lastCount = successCount + errorCount;
                }
                else
                {
                    int cnt = successCount + errorCount - lastCount;
                    cnt = Data.Length * cnt / 1024 * (1000 / timer.Interval);
                    double total = (successCount + errorCount) * Data.Length / 1024.0;

                    InvokeDelegate invokeDelegate = delegate()
                    {
                        label3.Text = cnt.ToString() + "KB/S " + total.ToString("#.0") + "KB";
                    };
                    InvokeUtil.Invoke(this, invokeDelegate);
                    lastCount = successCount + errorCount;
                }
            });
            timer.Start();
        }
        #endregion

        #region btnStop_Click
        private void btnStop_Click(object sender, EventArgs e)
        {
            start = false;
            timer.Stop();
            timer.Dispose();
            timer = new System.Windows.Forms.Timer();
        }
        #endregion

        #region 接收串口数据事件
        /// <summary>
        /// 接收串口数据事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void serialPort_DataReceived1(object sender, SerialDataReceivedEventArgs e)
        {
            if (serialPort1.ReadLine() != null)
            {
                successCount++;
                SendData();
            }
        }

        /// <summary>
        /// 接收串口数据事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void serialPort_DataReceived2(object sender, SerialDataReceivedEventArgs e)
        {
            List<byte> bList = new List<byte>();
            int i = 0;
            while (serialPort2.BytesToRead > 0)
            {
                byte[] bArr = new byte[serialPort2.BytesToRead];
                i += serialPort2.Read(bArr, 0, bArr.Length);
                bList.AddRange(bArr);
            }
            serialPort2.WriteLine("success");

            string s = ASCIIEncoding.UTF8.GetString(bList.ToArray());
            InvokeDelegate invokeDelegate = delegate()
            {
                textBox2.Text = s;
            };
            InvokeUtil.Invoke(this, invokeDelegate);

            if (s != Str)
            {
                errorCount++;
                invokeDelegate = delegate()
                {
                    label2.Text = errorCount + "次不相等(失败)";
                };
                InvokeUtil.Invoke(this, invokeDelegate);
            }
            else
            {
                invokeDelegate = delegate()
                {
                    label1.Text = successCount + "次相等(成功)";
                };
                InvokeUtil.Invoke(this, invokeDelegate);
            }
        }
        #endregion

        #region 发送数据
        private void SendData()
        {
            if (start)
            {
                Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)
                {
                    InvokeDelegate invokeDelegate = delegate()
                    {
                        textBox1.Text = Str;
                    };
                    InvokeUtil.Invoke(this, invokeDelegate);

                    serialPort1.Write(Data, 0, Data.Length);
                }));
                thread.Start();
            }
        }
        #endregion

        #region 数据
        private static byte[] data = null;
        /// <summary>
        /// 数据
        /// </summary>
        private static byte[] Data
        {
            get
            {
                if (data == null)
                {
                    data = ASCIIEncoding.UTF8.GetBytes(Str);
                }

                return data;
            }
        }
        #endregion

        #region 获取字符串
        private static string str = null;
        /// <summary>
        /// 字符串
        /// </summary>
        private static string Str
        {
            get
            {
                if (str == null)
                {
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < 270; i++)
                    {
                        sb.Append("计算机程序");
                    }
                    str = sb.ToString();
                }

                return str;
            }
        }
        #endregion

    }
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-20
  • 2021-09-12
  • 2021-12-01
  • 2022-12-23
猜你喜欢
  • 2021-05-11
  • 2021-12-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案