夏夜星语电子科技工作室C#编写串口程序夏夜星语电子科技工作室2015年2月4日夏夜星语电子科技工作室最近需要用到了C#写一个上位机,因为本人非软件专业,对于电脑软件编程还算陌生,所以今天试着在VisualStudio2008写了一个串口助手用来练手。在编写的过程中参考了许多网上的教程,在此对无私奉献的网友们深表感谢。依然是我一贯的作风,成果取自于网络,自当也要提供于网络,故我将这两天的学习整理成该文档,作为阶段性学习总结,也方便以后有人学习可以更方便。废话不多说了,把今天写的这个C#串口助手的编写记录下来吧。因为我也是刚刚接触C#两天,如果程序中有不足的地方,希望大家可以谅解,也欢迎批评指正。串口调试小程序功能:通过“串口设置”来设置串口的相应参数,“串口检测”可以用来检测计算机可用的串口。“发送数据”可以将“数据发送”栏中的数据通过串口发送出去。一旦串口接收到数据,则会在“数据接收”栏中显示出来,通过先前设置的“字符显示”或者“HEX显示”来以字符显示或者以十六进制数显示。“清空数据”则可以清除“数据接收”栏以及“收据发送”栏中的所有数据。串口调试小程序主界面:夏夜星语电子科技工作室在VisualStudio2008菜单栏点击“文件”“新建项目”,创建VisualC#下的Windows窗体应用程序:在窗体上添加三个“GroupBox”控件,分别将窗体分为“串口设置”、“数据接收”以及“数据发送”三部分。添加若干“Label”和“ComboBox”分别用于串口号、波特率、停止位、奇偶校验、数据位等的设置;添加两个“RodioButton”用于字符显示和HEX显示的选择;添加若干“Button”用于串口检测、打开串口、清空数据以及发送数据等功能按钮;最后分别在数据接收栏和数据发送栏中各添加一个“TextBox”控件,用于数据的收发。对各个布置好的控件进行命名,方便编程。另外更改“字符显示”的RodioButton控件属性中的Checked为true,使在打开程序后默认选择“字符显示”。更改数据接收栏中的TextBox控件属性中的ReadOnly为true,使这个空间只能显示接收到的数据,不能被编辑。更改窗体Form属性中的AcceptButton为btnSend(发送数据按钮的名称),使在窗体下按下回车键关联“发送数据”按钮。夏夜星语电子科技工作室程序中所有用到控件的名称更改如下:双击控件可以在程序中添加相应代码,本程序所有代码在本文的最后粘贴出来,大家可以根据代码以及注释来学习C#下的串口程序编写。另外现在的多数笔记本电脑已经没有串口,我们可以购买USB转串口模块来学习串口。另外告诉大家一个小诀窍:为了方便软件测试,可以将串口的RX和TX用杜邦线连接,这样串口发出的信息就能被自己接收到了,仅用一个串口就能调试该软件。夏夜星语电子科技工作室程序代码:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{SerialPortsp=null;//声明一个串口类boolisOpen=false;//打开串口标志位boolisSetProperty=false;//属性设置标志位boolisHex=false;//十六进制显示标志位publicForm1(){InitializeComponent();//窗口初始化,net自动生成}privatevoidForm1_Load(objectsender,EventArgse){this.MaximumSize=this.Size;this.MinimumSize=this.Size;this.MaximizeBox=false;for(inti=0;i10;i++)//最大支持到串口10,可根据自己需求增加{cbxCOMPort.Items.Add(COM+(i+1).ToString());}cbxCOMPort.SelectedIndex=0;//列出常用的波特率cbxBaudRate.Items.Add(1200);cbxBaudRate.Items.Add(2400);cbxBaudRate.Items.Add(4800);cbxBaudRate.Items.Add(9600);cbxBaudRate.Items.Add(19200);cbxBaudRate.Items.Add(38400);夏夜星语电子科技工作室cbxBaudRate.Items.Add(43000);cbxBaudRate.Items.Add(56000);cbxBaudRate.Items.Add(57600);cbxBaudRate.Items.Add(115200);cbxBaudRate.SelectedIndex=5;//列出停止位cbxStopBits.Items.Add(0);cbxStopBits.Items.Add(1);cbxStopBits.Items.Add(1.5);cbxStopBits.Items.Add(2);cbxStopBits.SelectedIndex=1;//列出数据位cbxDataBits.Items.Add(8);cbxDataBits.Items.Add(7);cbxDataBits.Items.Add(6);cbxDataBits.Items.Add(5);cbxDataBits.SelectedIndex=0;//列出奇偶校验位cbxParity.Items.Add(无);cbxParity.Items.Add(奇校验);cbxParity.Items.Add(偶校验);cbxParity.SelectedIndex=0;//默认为Char显示rbnChar.Checked=true;}privatevoidbtnCheckCOM_Click(objectsender,EventArgse)//检测哪些串口可用{boolcomExistence=false;//有可用串口标志位cbxCOMPort.Items.Clear();//清除当前串口号中的所有串口名称for(inti=0;i10;i++){try{SerialPortsp=newSerialPort(COM+(i+1).ToString());sp.Open();sp.Close();cbxCOMPort.Items.Add(COM+(i+1).ToString());comExistence=true;}catch(Exception){continue;夏夜星语电子科技工作室}}if(comExistence){cbxCOMPort.SelectedIndex=0;//使ListBox显示第1个添加的索引}else{MessageBox.Show(没有找到可用串口!,错误提示);}}privateboolCheckPortSetting()//检查串口是否设置{if(cbxCOMPort.Text.Trim()==)returnfalse;if(cbxBaudRate.Text.Trim()==)returnfalse;if(cbxDataBits.Text.Trim()==)returnfalse;if(cbxParity.Text.Trim()==)returnfalse;if(cbxStopBits.Text.Trim()==)returnfalse;returntrue;}privateboolCheckSendData(){if(tbxSendData.Text.Trim()==)returnfalse;returntrue;}privatevoidSetPortProperty()//设置串口的属性{sp=newSerialPort();sp.PortName=cbxCOMPort.Text.Trim();//设置串口名sp.BaudRate=Convert.ToInt32(cbxBaudRate.Text.Trim());//设置串口的波特率floatf=Convert.ToSingle(cbxStopBits.Text.Trim());//设置停止位if(f==0){sp.StopBits=StopBits.None;}elseif(f==1.5){夏夜星语电子科技工作室sp.StopBits=StopBits.OnePointFive;}elseif(f==1){sp.StopBits=StopBits.One;}elseif(f==2){sp.StopBits=StopBits.Two;}else{sp.StopBits=StopBits.One;}sp.DataBits=Convert.ToInt16(cbxDataBits.Text.Trim());//设置数据位strings=cbxParity.Text.Trim();//设置奇偶校验位if(s.CompareTo(无)==0){sp.Parity=Parity.None;}elseif(s.CompareTo(奇校验)==0){sp.Parity=Parity.Odd;}elseif(s.CompareTo(偶校验)==0){sp.Parity=Parity.Even;}else{sp.Parity=Parity.None;}sp.ReadTimeout=-1;//设置超时读取时间sp.RtsEnable=true;//定义DataReceived事件,当串口收到数据后触发事件sp.DataReceived+=newSerialDataReceivedEventHandler(sp_DataReceived);if(rbnHex.Checked){夏夜星语电子科技工作室isHex=true;}else{isHex=false;}}privatevoidbtnSend_Click(objectsender,EventArgse)//发送串口数据{if(isOpen)//写串口数据{try{sp.WriteLine(tbxSendData.Text);}catch(Exception){MessageBox.Show(发送数据时发生错误!,错误提示);return;}}else{MessageBox.Show(串口未打开!,错误提示);return;}if(!CheckSendData())//检测要发送的数据{MessageBox.Show(请输入要发送的数据!,错误提示);return;}}privatevoidbtnOpenCom_Click(objectsender,EventArgse){if(isOpen==false){if(!CheckPortSetting())//检测串口设置{MessageBox.Show(串口未设置!,错误提示);return;}夏夜星语电子科技工作室if(!isSetProperty)//串口未设置则设置串口{SetPortProperty();isSetProperty=true;}try//打开串口{sp.Open();isOpen=true;btnOpenCom.Text=关闭串口;//串口打开后则相关的串口设置按钮便不可再用cbxCOMPort.Enabled=false;cbxBaudRate.Enabled=false;cbxDataBits.Enabled=false;cbxParity.Enabled=false;cbxStopBits.Enabled=false;rbnChar.Enabled=f