C#怎么实现简单串口通讯
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容主要讲解"C#怎么实现简单串口通讯",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#怎么实现简单串口通讯"吧!参数设置界面代码:using Sys
千家信息网最后更新 2026年10月31日C#怎么实现简单串口通讯
本篇内容主要讲解"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#
波特率
波特
口号
线程
信息
内容
参数
错误
代码
时钟
界面
学习
设计
选择
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
互联网加科技
华服互联网科技靠谱吗
博彦科技互联网金融
金融科技还是互联网
互联网科技公司发展
中国 科技 互联网
互联网科技集团
奇酷互联网络科技
北京互联网络科技有限公司
菲比寻常互联网科技
撒么互联网科技公司
知域互联网科技有限公司大骗子
互联网5g黑科技有哪些
青海科技产业互联网发展
风投北京互联网科技
卡尔迅互联网科技有限公司
江苏互联网智能科技产品出厂价
广西科技产业互联网是什么
安徽零酒互联网科技有限公司
耶加雪菲
南京欣网互联网络科技有限公司
科技互联网政务服务
沃里互联网科技
苏州大垚互联网科技
联恩商钥互联网科技有限公司
顶级互联网科技成果有哪些
每天都有哪些好的互联网科技
平安好医生打造互联网科技医疗
颐高云石互联网科技