亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#串口通信實現方法

2020-01-24 02:15:22
字體:
來源:轉載
供稿:網友

本文實例講述了C#串口通信實現方法。分享給大家供大家參考。具體方法如下:

通過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

    }
}

輔助代碼如下:

復制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Utils
{
    /// <summary>
    /// 跨線程訪問控件的委托
    /// </summary>
    public delegate void InvokeDelegate();

    /// <summary>
    /// 跨線程訪問控件類
    /// </summary>
    public class InvokeUtil
    {
        /// <summary>
        /// 跨線程訪問控件
        /// </summary>
        /// <param name="ctrl">Form對象</param>
        /// <param name="de">委托</param>
        public static void Invoke(Control ctrl, Delegate de)
        {
            if (ctrl.IsHandleCreated)
            {
                ctrl.BeginInvoke(de);
            }
        }
    }
}

復制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Security.Permissions;
using System.IO.Ports;
using System.Security;

namespace Utils
{
    /// <summary>
    /// 串口資源工具類
    /// </summary>
    public class SerialPortUtil
    {
        #region 獲取本機串口列表,包括虛擬串口
        /// <summary>
        /// 獲取本機串口列表,包括虛擬串口
        /// </summary>
        public static string[] GetCOMList()
        {
            List<string> list = new List<string>();

            foreach (string portName in SerialPort.GetPortNames())
            {
                list.Add(portName);
            }

            return list.ToArray();
        }
        #endregion

        #region 從注冊表獲取本機串口列表
        /// <summary>
        /// 從注冊表獲取本機串口列表
        /// </summary>
        public static string[] GetPortNames()
        {
            RegistryKey localMachine = null;
            RegistryKey key2 = null;
            string[] textArray = null;

            //這里有個斷言,判斷該注冊表項是否存在
            new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM").Assert();

            try
            {
                localMachine = Registry.LocalMachine;
                key2 = localMachine.OpenSubKey(@"HARDWARE/DEVICEMAP/SERIALCOMM", false);
                if (key2 != null)
                {
                    string[] valueNames = key2.GetValueNames();
                    textArray = new string[valueNames.Length];
                    for (int i = 0; i < valueNames.Length; i++)
                    {
                        textArray[i] = (string)key2.GetValue(valueNames[i]);
                    }
                }
            }
            finally
            {
                if (localMachine != null)
                {
                    localMachine.Close();
                }
                if (key2 != null)
                {
                    key2.Close();
                }
                CodeAccessPermission.RevertAssert();
            }
            if (textArray == null)
            {
                textArray = new string[0];
            }
            return textArray;
        }
        #endregion

    }
}

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产户外野外| 亚洲欧美综合另类中字| 欧美午夜性色大片在线观看| 亚洲韩国欧洲国产日产av| 亚洲一区久久久| 亚洲国产精品免费| 欧美影院久久久| 欧美特级www| 91精品国产免费久久久久久| 久久精品色欧美aⅴ一区二区| 最近中文字幕mv在线一区二区三区四区| 92看片淫黄大片看国产片| 亚洲人成网7777777国产| 亚洲高清不卡av| 国产在线999| 日本亚洲欧洲色| 96pao国产成视频永久免费| 亚洲国产精品99久久| 国产精品久久久91| 欧洲s码亚洲m码精品一区| 国产日韩在线播放| 2020欧美日韩在线视频| 精品动漫一区二区| 91免费综合在线| 亚洲男子天堂网| 欧美性videos高清精品| 欧美多人乱p欧美4p久久| 久久99国产精品自在自在app| 亚洲欧美综合图区| 欧美激情综合色| 日韩久久精品电影| 免费不卡欧美自拍视频| 亚洲人成网站999久久久综合| 国产成人精品国内自产拍免费看| 欧美激情一二区| 亚洲视频在线观看网站| 国产午夜精品视频免费不卡69堂| 青青在线视频一区二区三区| 精品视频在线观看日韩| 97国产精品视频人人做人人爱| 国产亚洲精品久久久优势| 91国内免费在线视频| 成人亚洲激情网| 欧美成人激情视频免费观看| 91九色国产视频| 精品自拍视频在线观看| 欧美一区二区大胆人体摄影专业网站| 欧美成人免费在线视频| 欧美极度另类性三渗透| 一个人www欧美| 色悠久久久久综合先锋影音下载| 久久久久久综合网天天| 国产精品人成电影| 国产精品美女主播在线观看纯欲| 日韩精品在线影院| 国产成人av在线播放| 91精品国产自产在线观看永久| 亚洲xxx大片| 成人精品一区二区三区电影黑人| 国产成人综合久久| 久久久精品2019中文字幕神马| 欧美美女操人视频| 国产日韩欧美在线观看| 欧美性xxxx极品高清hd直播| 91精品国产九九九久久久亚洲| 欧洲亚洲免费在线| 国产极品jizzhd欧美| 国产69久久精品成人| 成人黄色免费在线观看| 成人精品视频99在线观看免费| 久久久久国产精品www| 美女国内精品自产拍在线播放| 精品香蕉一区二区三区| 91干在线观看| 粗暴蹂躏中文一区二区三区| 在线精品视频视频中文字幕| 成人在线一区二区| 伊人精品在线观看| 亚洲xxxx视频| 91精品综合久久久久久五月天| 国产中文日韩欧美| 亚洲精品久久久久中文字幕二区| 亚洲欧洲一区二区三区久久| 日韩亚洲欧美成人| 欧美成年人视频网站| 亚洲aa中文字幕| 精品国产电影一区| 日韩欧美成人区| 亚洲嫩模很污视频| 三级精品视频久久久久| 另类视频在线观看| 中文字幕亚洲综合久久| 日韩视频免费看| 成人在线激情视频| 国产精品国产三级国产专播精品人| 亚洲国产成人爱av在线播放| 日韩视频一区在线| 亚洲激情视频网站| 日本高清久久天堂| 亚洲丝袜一区在线| 日本一区二区在线播放| 国产精品久久久久久久久借妻| 欧美高跟鞋交xxxxhd| 国产精品成久久久久三级| 98精品在线视频| 亚洲午夜激情免费视频| 久久久www成人免费精品张筱雨| 一夜七次郎国产精品亚洲| 亚洲欧美一区二区激情| 亚洲美女免费精品视频在线观看| 国产小视频国产精品| 亚洲成人黄色网址| 日韩美女免费线视频| 亚洲欧美综合图区| 亚洲国产又黄又爽女人高潮的| 国产精品jvid在线观看蜜臀| 国产999视频| 夜夜躁日日躁狠狠久久88av| 亚洲第一区中文字幕| 日av在线播放中文不卡| 91香蕉嫩草神马影院在线观看| 久久国产精品影片| 日韩在线中文字幕| 91精品国产99| 日韩禁在线播放| 综合国产在线观看| 最好看的2019年中文视频| 久久久国产91| 亚洲精品视频久久| 爽爽爽爽爽爽爽成人免费观看| 在线视频一区二区| 国产美女久久精品| 国产精品夜间视频香蕉| 日韩精品欧美国产精品忘忧草| 日韩有码在线视频| 国产欧美日韩丝袜精品一区| 日韩免费电影在线观看| 欧美成年人视频网站| 91热精品视频| 中文字幕在线观看亚洲| 这里只有精品在线播放| 一区二区av在线| 久久久久北条麻妃免费看| 日韩av在线天堂网| 精品国产欧美成人夜夜嗨| 亚洲欧美激情四射在线日| 日韩一区二区精品视频| 日韩国产欧美区| 亚洲成年人在线播放| 久久精品国产99国产精品澳门| 久久精品成人动漫| 精品视频在线播放色网色视频| www.xxxx欧美| 中文字幕亚洲欧美一区二区三区| 欧美性xxxxxxxxx| 欧美裸体xxxx| 国产精品久久久久久久久久尿| 热久久视久久精品18亚洲精品| 久久久久久久久久国产精品| 久久精品视频va| 法国裸体一区二区| 国产欧美在线播放| 日韩亚洲欧美中文在线| 精品亚洲男同gayvideo网站|