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

参数设置界面代码:

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;namespaceComDemo{publicpartialclassComSet:Form{publicComSet(){InitializeComponent();}privatevoidComSet_Load(objectsender,EventArgse){//串口string[]ports=SerialPort.GetPortNames();foreach(stringportinports){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;}privatevoidbntOK_Click(objectsender,EventArgse){//以下4个参数都是从窗体MainForm传入的MainForm.strProtName=cmbPort.Text;MainForm.strBaudRate=cmbBaudRate.Text;MainForm.strDataBits=cmbDataBits.Text;MainForm.strStopBits=cmbStopBit.Text;DialogResult=DialogResult.OK;}privatevoidbntCancel_Click(objectsender,EventArgse){DialogResult=DialogResult.Cancel;}}}

主界面代码:

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;usingSystem.IO;usingSystem.Threading;namespaceComDemo{publicpartialclassMainForm:Form{publicMainForm(){InitializeComponent();}privateThreadgetRecevice;protectedBooleanstop=false;protectedBooleanconState=false;privateStreamReadersRead;stringstrRecieve;boolbAccpet=false;SerialPortsp=newSerialPort();//实例化串口通讯类//以下定义4个公有变量,用于参数传递publicstaticstringstrProtName="";publicstaticstringstrBaudRate="";publicstaticstringstrDataBits="";publicstaticstringstrStopBits="";privatevoidMainForm_Load(objectsender,EventArgse){groupBox1.Enabled=false;groupBox2.Enabled=false;this.toolStripStatusLabel1.Text="端口号:端口未打开|";this.toolStripStatusLabel2.Text="波特率:端口未打开|";this.toolStripStatusLabel3.Text="数据位:端口未打开|";this.toolStripStatusLabel4.Text="停止位:端口未打开|";this.toolStripStatusLabel5.Text="";}//串口设计privatevoidbtnSetSP_Click(objectsender,EventArgse){timer1.Enabled=false;sp.Close();ComSetdlg=newComSet();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异常}}//打开/关闭串口privatevoidbntSwitchSP_Click(objectsender,EventArgse){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(Exceptionex){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="";}}//发送数据privatevoidbntSendData_Click(objectsender,EventArgse){if(sp.IsOpen){try{sp.Encoding=System.Text.Encoding.GetEncoding("GB2312");sp.Write(txtSend.Text);//发送数据}catch(Exceptionex){MessageBox.Show("错误:"+ex.Message);}}else{MessageBox.Show("请先打开串口!");}}//选择文件privatevoidbtnOpenFile_Click(objectsender,EventArgse){OpenFileDialogopen=newOpenFileDialog();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(Exceptionerr1){MessageBox.Show("文件打开错误!"+err1.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);}}}//发送文件内容privatevoidbntSendFile_Click(objectsender,EventArgse){stringfileName=txtFileName.Text.Trim();if(fileName==""){MessageBox.Show("请选择要发送的文件!","Error");return;}else{//sRead=newStreamReader(fileName);sRead=newStreamReader(fileName,Encoding.Default);//解决中文乱码问题}timer1.Start();}//发送文件时钟privatevoidtimer1_Tick(objectsender,EventArgse){stringstr1;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="文件发送中...";}//接收数据privatevoidbtnReceiveData_Click(objectsender,EventArgse){if(btnReceiveData.Text=="接收数据"){sp.Encoding=Encoding.GetEncoding("GB2312");if(sp.IsOpen){//timer2.Enabled=true;//使用主线程进行//使用委托以及多线程进行bAccpet=true;getRecevice=newThread(newThreadStart(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="接收数据";}}privatevoidtestDelegate(){reactionr=newreaction(fun);r();}//用于接收数据的定时时钟privatevoidtimer2_Tick(objectsender,EventArgse){stringstr=sp.ReadExisting();stringstr2=str.Replace("\r","\r\n");txtReceiveData.AppendText(str2);txtReceiveData.ScrollToCaret();}//下面用到了接收信息的代理功能,此为设计的要点之一delegatevoidDelegateAcceptData();voidfun(){while(bAccpet){AcceptData();}}delegatevoidreaction();voidAcceptData(){if(txtReceiveData.InvokeRequired){try{DelegateAcceptDataddd=newDelegateAcceptData(AcceptData);this.Invoke(ddd,newobject[]{});}catch{}}else{try{strRecieve=sp.ReadExisting();txtReceiveData.AppendText(strRecieve);}catch(Exceptionex){}}}privatevoidbntClear_Click(objectsender,EventArgse){txtReceiveData.Text="";}privatevoidbutton3_Click(objectsender,EventArgse){try{stringpath=Directory.GetCurrentDirectory()+@"\output.txt";stringcontent=this.txtReceiveData.Text;FileStreamfs=newFileStream(path,FileMode.OpenOrCreate,FileAccess.Write);StreamWriterwrite=newStreamWriter(fs);write.Write(content);write.Flush();write.Close();fs.Close();MessageBox.Show("接收信息导出在:"+path);}catch(Exceptionex){MessageBox.Show(ex.Message);}}}}

效果图

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