在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例Windows系统编程 → 串口通信示例

串口通信示例

Windows系统编程

下载此实例
  • 开发语言:C#
  • 实例大小:0.01M
  • 下载次数:80
  • 浏览次数:382
  • 发布时间:2019-03-13
  • 实例类别:Windows系统编程
  • 发 布 人:imike2019
  • 文件格式:.rar
  • 所需积分:0
 相关标签: 串口 通信 串口通信

实例介绍

【实例简介】
【实例截图】from clipboard

【核心代码】

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.IO;
using System.Text.RegularExpressions;

namespace SerialPortDemo
{
    public partial class Form1 : Form
    {
        private SerialPort spCom = new SerialPort();
        private StringBuilder strBuilderRx = new StringBuilder();
        private Timer timerAutoSend = new Timer();
        private long nCountRx = 0;
        private long nCountTx = 0;
        private string strFn;

        public Form1()
        {
            InitializeComponent();
        }

        private void SerialPortForm_Load(object sender, EventArgs e)
        {
            string[] straPorts = SerialPort.GetPortNames();
            Array.Sort(straPorts);
            comboPortName.Items.AddRange(straPorts);
            comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;
            comboBaudRate.SelectedIndex = comboBaudRate.Items.IndexOf("9600");
            comboParity.SelectedIndex = comboParity.Items.IndexOf("None");
            comboDataBits.SelectedIndex = comboDataBits.Items.IndexOf("8");
            comboStopBits.SelectedIndex = comboStopBits.Items.IndexOf("1");

            spCom.NewLine = "\r\n";
            spCom.RtsEnable = true;

            buttonSend.Enabled = false;
            checkBoxAutoSend.Enabled = false;
            checkBoxNewLineRx.CheckState = CheckState.Checked;
            buttonSendFile.Enabled = false;

            comboPortName.Enabled = true;
            comboBaudRate.Enabled = true;
            comboParity.Enabled = true;
            comboDataBits.Enabled = true;
            comboStopBits.Enabled = true;

            textBoxTx.Text = "COM";
            textBoxTimerMs.Text = "1000";

            spCom.DataReceived  = new SerialDataReceivedEventHandler(Com_DataReceived);
            timerAutoSend.Tick  = new EventHandler(AutoSendTimer_Tick);
        }

        void AutoSendTimer_Tick(object sender, EventArgs e)
        {
            buttonSend_Click(sender, e);
        }

        void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int nReadSum = spCom.BytesToRead;
            nCountRx  = nReadSum;

            byte[] byteaBuf = new byte[nReadSum];
            spCom.Read(byteaBuf, 0, nReadSum);

            strBuilderRx.Clear();

            //因为要访问ui资源,所以需要使用invoke方式同步ui
            this.Invoke((EventHandler)(delegate
            {

                if (checkBoxHexView.Checked)
                {
                    foreach (byte byteBit in byteaBuf)
                    {
                        strBuilderRx.Append(byteBit.ToString("X2")   " ");
                    }
                }
                else
                {
                    strBuilderRx.Append(Encoding.ASCII.GetString(byteaBuf));
                }

                this.textBoxRx.AppendText(strBuilderRx.ToString());
                labelSumRx.Text = "Get:"   nCountRx.ToString();
            }));
        }

        private void buttonOpen_Click(object sender, EventArgs e)
        {
            if (spCom.IsOpen)
            {
                spCom.Close();
            }
            else
            {
                spCom.PortName = comboPortName.Text;
                spCom.BaudRate = int.Parse(comboBaudRate.Text);

                switch (comboParity.Text)
                {
                    case "None":
                        spCom.Parity = Parity.None;
                        break;
                    case "Odd":
                        spCom.Parity = Parity.Odd;
                        break;
                    case "Even":
                        spCom.Parity = Parity.Even;
                        break;
                    case "Mark":
                        spCom.Parity = Parity.Mark;
                        break;
                    case "Space":
                        spCom.Parity = Parity.Space;
                        break;
                    default:
                        spCom.Parity = Parity.None;
                        break;
                }

                spCom.DataBits = int.Parse(comboDataBits.Text);

                switch (comboStopBits.Text)
                {
                    case "1":
                        spCom.StopBits = StopBits.One;
                        break;
                    case "1.5":
                        spCom.StopBits = StopBits.OnePointFive;
                        break;
                    case "2":
                        spCom.StopBits = StopBits.Two;
                        break;
                    default:
                        spCom.StopBits = StopBits.One;
                        break;
                }

                try
                {
                    spCom.Open();
                }
                catch (System.Exception ex)
                {
                    spCom = new SerialPort();
                    MessageBox.Show(ex.Message);
                }
            }
            buttonOpen.Text = spCom.IsOpen ? "Close" : "Open";
            buttonSend.Enabled = spCom.IsOpen;
            checkBoxAutoSend.Enabled = spCom.IsOpen;
            buttonSendFile.Enabled = spCom.IsOpen;

            comboPortName.Enabled = !spCom.IsOpen;
            comboBaudRate.Enabled = !spCom.IsOpen;
            comboParity.Enabled = !spCom.IsOpen;
            comboDataBits.Enabled = !spCom.IsOpen;
            comboStopBits.Enabled = !spCom.IsOpen;
        }

        private void checkBoxNewLineRx_CheckedChanged(object sender, EventArgs e)
        {
            textBoxRx.WordWrap = checkBoxNewLineRx.Checked;
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            int nSendSum = 0;
            if (checkBoxHexSend.Checked)
            {
                MatchCollection mc = Regex.Matches(textBoxTx.Text, @"(?i)[\da-f]{2}");
                List<byte> buf = new List<byte>();
                foreach (Match m in mc)
                {
                    buf.Add(byte.Parse(m.Value));
                }

                spCom.Write(buf.ToArray(), 0, buf.Count);

                nSendSum = buf.Count;

            }
            else
            {
                if (checkBoxNewLineTx.Checked)
                {
                    spCom.WriteLine(textBoxTx.Text);
                    nSendSum = textBoxTx.Text.Length   2;
                }
                else
                {
                    spCom.Write(textBoxTx.Text);
                    nSendSum = textBoxTx.Text.Length;
                }
            }
            nCountTx  = nSendSum;
            labelSumTx.Text = "Send:"   nCountTx.ToString();
        }

        private void buttonReset_Click(object sender, EventArgs e)
        {
            nCountTx = nCountRx = 0;
            labelSumRx.Text = "Get:0";
            labelSumTx.Text = "Send:0";

            checkBoxHexView.CheckState = CheckState.Unchecked;
            checkBoxNewLineRx.CheckState = CheckState.Checked;
            checkBoxHexSend.CheckState = CheckState.Unchecked;
            checkBoxNewLineTx.CheckState = CheckState.Unchecked;
            checkBoxAutoSend.CheckState = CheckState.Unchecked;

            textBoxRx.Clear();
            textBoxTx.Clear();
        }

        private void buttonZeroCount_Click(object sender, EventArgs e)
        {
            nCountTx = nCountRx = 0;
            labelSumTx.Text = "Send:"   nCountTx.ToString();
            labelSumRx.Text = "Get:"   nCountRx.ToString();
        }

        private void buttonClearRx_Click(object sender, EventArgs e)
        {
            textBoxRx.Clear();
        }

        private void AutoSend(object sender, EventArgs e)
        {
            if (checkBoxAutoSend.Checked == true)
            {
                timerAutoSend.Interval = Convert.ToInt32(textBoxTimerMs.Text, 10);
                timerAutoSend.Start();
            }
            else
            {
                timerAutoSend.Stop();
            }
        }

        private void Timer_ms_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8)
            {
                e.Handled = true;
            }
        }

        private void buttonSaveRx_Click(object sender, EventArgs e)
        {
            if (dlgSaveFile.ShowDialog() == DialogResult.OK)
            {
                strFn = dlgSaveFile.FileName;
                try
                {
                    File.WriteAllText(strFn, textBoxRx.Text);
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message, "SerialPort Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void buttonClearTx_Click(object sender, EventArgs e)
        {
            textBoxTx.Clear();
        }

        private void buttonSendFile_Click(object sender, EventArgs e)
        {
            if (dlgOpenFile.ShowDialog() == DialogResult.OK)
            {
                strFn = dlgOpenFile.FileName;
                try
                {
                    spCom.Write(File.ReadAllText(strFn));
                    nCountTx  = File.ReadAllText(strFn).Length;
                    labelSumTx.Text = "Send:"   nCountTx.ToString();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message, "SerialPort Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
    }
}

实例下载地址

串口通信示例

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 jexiang 发表于: 2019-04-02 21:30 21
谢谢分享,学习学习!!!

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警