文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#怎么实现简单串口通讯

2023-06-29 05:17

关注

本篇内容主要讲解“C#怎么实现简单串口通讯”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么实现简单串口通讯”吧!

参数设置界面代码:

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;namespace ComDemo{    public partial class ComSet : Form    {        public ComSet()        {            InitializeComponent();        }        private void ComSet_Load(object sender, EventArgs e)        {            //串口            string[] ports = SerialPort.GetPortNames();            foreach (string port in ports)            {                cmbPort.Items.Add(port);            }            cmbPort.SelectedIndex = 0;            //波特率            cmbBaudRate.Items.Add("110");            cmbBaudRate.Items.Add("300");            cmbBaudRate.Items.Add("1200");            cmbBaudRate.Items.Add("2400");            cmbBaudRate.Items.Add("4800");            cmbBaudRate.Items.Add("9600");            cmbBaudRate.Items.Add("19200");            cmbBaudRate.Items.Add("38400");            cmbBaudRate.Items.Add("57600");            cmbBaudRate.Items.Add("115200");            cmbBaudRate.Items.Add("230400");            cmbBaudRate.Items.Add("460800");            cmbBaudRate.Items.Add("921600");            cmbBaudRate.SelectedIndex = 5;            //数据位            cmbDataBits.Items.Add("5");            cmbDataBits.Items.Add("6");            cmbDataBits.Items.Add("7");            cmbDataBits.Items.Add("8");            cmbDataBits.SelectedIndex = 3;            //停止位            cmbStopBit.Items.Add("1");            cmbStopBit.SelectedIndex = 0;            //佼验位            cmbParity.Items.Add("无");            cmbParity.SelectedIndex = 0;        }        private void bntOK_Click(object sender, EventArgs e)        {            //以下4个参数都是从窗体MainForm传入的            MainForm.strProtName = cmbPort.Text;            MainForm.strBaudRate = cmbBaudRate.Text;            MainForm.strDataBits = cmbDataBits.Text;            MainForm.strStopBits = cmbStopBit.Text;            DialogResult = DialogResult.OK;        }        private void bntCancel_Click(object sender, EventArgs e)        {            DialogResult = DialogResult.Cancel;        }    }}

主界面代码:

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.Threading;namespace ComDemo{    public partial class MainForm : Form    {        public MainForm()        {            InitializeComponent();        }        private Thread getRecevice;        protected Boolean stop = false;        protected Boolean conState = false;        private StreamReader sRead;        string strRecieve;        bool bAccpet = false;        SerialPort sp = new SerialPort();//实例化串口通讯类        //以下定义4个公有变量,用于参数传递        public static string strProtName = "";        public static string strBaudRate = "";        public static string strDataBits = "";        public static string strStopBits = "";        private void MainForm_Load(object sender, EventArgs e)        {            groupBox1.Enabled = false;            groupBox2.Enabled = false;            this.toolStripStatusLabel1.Text = "端口号:端口未打开 | ";            this.toolStripStatusLabel2.Text = "波特率:端口未打开 | ";            this.toolStripStatusLabel3.Text = "数据位:端口未打开 | ";            this.toolStripStatusLabel4.Text = "停止位:端口未打开 | ";            this.toolStripStatusLabel5.Text = "";        }        //串口设计        private void btnSetSP_Click(object sender, EventArgs e)        {            timer1.Enabled = false;            sp.Close();            ComSet dlg = new ComSet();            if (dlg.ShowDialog() == DialogResult.OK)            {                sp.PortName = strProtName;//串口号                sp.BaudRate = int.Parse(strBaudRate);//波特率                sp.DataBits = int.Parse(strDataBits);//数据位                sp.StopBits = (StopBits)int.Parse(strStopBits);//停止位                sp.ReadTimeout = 500;//读取数据的超时时间,引发ReadExisting异常            }        }        //打开/关闭串口        private void bntSwitchSP_Click(object sender, EventArgs e)        {            if (bntSwitchSP.Text == "打开串口")            {                if (strProtName != "" && strBaudRate != "" && strDataBits != "" && strStopBits != "")                {                    try                    {                        if (sp.IsOpen)                        {                            sp.Close();                            sp.Open();//打开串口                        }                        else                        {                            sp.Open();//打开串口                        }                        bntSwitchSP.Text = "关闭串口";                        groupBox1.Enabled = true;                        groupBox2.Enabled = true;                        this.toolStripStatusLabel1.Text = "端口号:" + sp.PortName + " | ";                        this.toolStripStatusLabel2.Text = "波特率:" + sp.BaudRate + " | ";                        this.toolStripStatusLabel3.Text = "数据位:" + sp.DataBits + " | ";                        this.toolStripStatusLabel4.Text = "停止位:" + sp.StopBits + " | ";                        this.toolStripStatusLabel5.Text = "";                    }                    catch (Exception ex)                    {                        MessageBox.Show("错误:" + ex.Message, "C#串口通信");                    }                }                else                {                    MessageBox.Show("请先设置串口!", "RS232串口通信");                }            }            else            {                timer1.Enabled = false;                timer2.Enabled = false;                bntSwitchSP.Text = "打开串口";                if (sp.IsOpen)                    sp.Close();                groupBox1.Enabled = false;                groupBox2.Enabled = false;                this.toolStripStatusLabel1.Text = "端口号:端口未打开 | ";                this.toolStripStatusLabel2.Text = "波特率:端口未打开 | ";                this.toolStripStatusLabel3.Text = "数据位:端口未打开 | ";                this.toolStripStatusLabel4.Text = "停止位:端口未打开 | ";                this.toolStripStatusLabel5.Text = "";            }        }        //发送数据        private void bntSendData_Click(object sender, EventArgs e)        {            if (sp.IsOpen)            {                try                {                    sp.Encoding = System.Text.Encoding.GetEncoding("GB2312");                    sp.Write(txtSend.Text);//发送数据                }                catch (Exception ex)                {                    MessageBox.Show("错误:" + ex.Message);                }            }            else            {                MessageBox.Show("请先打开串口!");            }        }        //选择文件        private void btnOpenFile_Click(object sender, EventArgs e)        {            OpenFileDialog open = new OpenFileDialog();            open.InitialDirectory = "c\\";            open.RestoreDirectory = true;            open.FilterIndex = 1;            open.Filter = "txt文件(*.txt)|*.txt";            if (open.ShowDialog() == DialogResult.OK)            {                try                {                    if (open.OpenFile() != null)                    {                        txtFileName.Text = open.FileName;                    }                }                catch (Exception err1)                {                    MessageBox.Show("文件打开错误!  " + err1.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);                }            }        }        //发送文件内容        private void bntSendFile_Click(object sender, EventArgs e)        {            string fileName = txtFileName.Text.Trim();            if (fileName == "")            {                MessageBox.Show("请选择要发送的文件!", "Error");                return;            }            else            {                //sRead = new StreamReader(fileName);                sRead = new StreamReader(fileName,Encoding.Default);//解决中文乱码问题            }            timer1.Start();        }        //发送文件时钟        private void timer1_Tick(object sender, EventArgs e)        {            string str1;            str1 = sRead.ReadLine();            if (str1 == null)            {                timer1.Stop();                sRead.Close();                MessageBox.Show("文件发送成功!", "C#串口通讯");                this.toolStripStatusLabel5.Text = "";                return;            }            byte[] data = Encoding.Default.GetBytes(str1);            sp.Write(data, 0, data.Length);            this.toolStripStatusLabel5.Text = "   文件发送中...";        }        //接收数据        private void btnReceiveData_Click(object sender, EventArgs e)        {            if (btnReceiveData.Text == "接收数据")            {                sp.Encoding = Encoding.GetEncoding("GB2312");                if (sp.IsOpen)                {                    //timer2.Enabled = true; //使用主线程进行                    //使用委托以及多线程进行                    bAccpet = true;                    getRecevice = new Thread(new ThreadStart(testDelegate));                    //getRecevice.IsBackground = true;                    getRecevice.Start();                    btnReceiveData.Text = "停止接收";                }                else                {                    MessageBox.Show("请先打开串口");                }            }            else            {                //timer2.Enabled = false;                bAccpet = false;                try                {   //停止主监听线程                    if (null != getRecevice)                    {                        if (getRecevice.IsAlive)                        {                            if (!getRecevice.Join(100))                            {                                //关闭线程                                getRecevice.Abort();                            }                        }                        getRecevice = null;                    }                }                catch { }                btnReceiveData.Text = "接收数据";            }        }        private void testDelegate()        {            reaction r = new reaction(fun);            r();        }        //用于接收数据的定时时钟        private void timer2_Tick(object sender, EventArgs e)        {            string str = sp.ReadExisting();            string str2 = str.Replace("\r", "\r\n");            txtReceiveData.AppendText(str2);            txtReceiveData.ScrollToCaret();        }        //下面用到了接收信息的代理功能,此为设计的要点之一        delegate void DelegateAcceptData();        void fun()        {            while (bAccpet)            {                AcceptData();            }        }        delegate void reaction();        void AcceptData()        {            if (txtReceiveData.InvokeRequired)            {                try                {                    DelegateAcceptData ddd = new DelegateAcceptData(AcceptData);                    this.Invoke(ddd, new object[] { });                }                catch { }            }            else            {                try                {                    strRecieve = sp.ReadExisting();                    txtReceiveData.AppendText(strRecieve);                }                catch (Exception ex) { }            }        }        private void bntClear_Click(object sender, EventArgs e)        {            txtReceiveData.Text = "";        }        private void button3_Click(object sender, EventArgs e)        {            try            {                string path = Directory.GetCurrentDirectory() + @"\output.txt";                string content = this.txtReceiveData.Text;                FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);                StreamWriter write = new StreamWriter(fs);                write.Write(content);                write.Flush();                write.Close();                fs.Close();                MessageBox.Show("接收信息导出在:" + path);            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }}

效果图

C#怎么实现简单串口通讯

到此,相信大家对“C#怎么实现简单串口通讯”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯