C#的SerialPort串口程序设计总结
2016-03-17 13:14
459 查看
简介:微软的VS提供了SerialPort控件,也就是串行端口资源。
当然也可以添加引用usingSystem.IO.Ports;
通过实例化SerialPort对象就可以使用其属性和方法了。
SerialPortserialPort1=newSerialPort();
最重要的几个属性:
serialPort1.Open();打开串行端口连接
serialPort1.Close();关闭串行端口连接
serialPort1.PortName获取或设置通信端口(COM)
serialPort1.BaudRate获取或设置串行波特率
serialPort1.DataBits获取或设置每个字节的标准数据位长度
serialPort1.StopBits获取或设置每个字节的标准停止位数
serialPort1.Parity获取或设置奇偶校验检查协议
serialPort1.DataReceived+=newSerialDataReceivedEventHandler(serialPort1_DataReceived);数据接收事件的方法
简单的界面示例代码如下:
当然也可以添加引用usingSystem.IO.Ports;
通过实例化SerialPort对象就可以使用其属性和方法了。
SerialPortserialPort1=newSerialPort();
最重要的几个属性:
serialPort1.Open();打开串行端口连接
serialPort1.Close();关闭串行端口连接
serialPort1.PortName获取或设置通信端口(COM)
serialPort1.BaudRate获取或设置串行波特率
serialPort1.DataBits获取或设置每个字节的标准数据位长度
serialPort1.StopBits获取或设置每个字节的标准停止位数
serialPort1.Parity获取或设置奇偶校验检查协议
serialPort1.DataReceived+=newSerialDataReceivedEventHandler(serialPort1_DataReceived);数据接收事件的方法
简单的界面示例代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.IO.Ports; usingSystem.IO; usingSystem.Timers; namespaceWinFromApp { publicpartialclassForm1:Form { privateStreamReadersRead; publicintiTextbox2=0; SerialPortserialPort1=newSerialPort(); publicForm1() { InitializeComponent(); } privateDateTime_dt=DateTime.Now;//定义一个成员函数用于保存每次的时间点 privatevoidtextBox2_KeyPress(objectsender,KeyPressEventArgse) { DateTimetempDt=DateTime.Now;//保存按键按下时刻的时间点 TimeSpants=tempDt.Subtract(_dt);//获取时间间隔 if(ts.Milliseconds>50)//判断时间间隔,如果时间间隔大于50毫秒,则将TextBox清空 textBox2.Text=""; _dt=tempDt; } privatevoidtimer1_Tick(objectsender,EventArgse) { stringstr1; str1=sRead.ReadLine(); if(str1==null) { timer1.Stop(); sRead.Close(); MessageBox.Show("发送完毕","NICE"); button2.Enabled=true; button3.Enabled=true; button4.Enabled=true; textBox1.Enabled=true; textBox3.Enabled=true; textBox4.Enabled=true; return; } byte[]data=Encoding.Default.GetBytes(str1); serialPort1.Write(data,0,data.Length); } privatevoidForm1_Load(objectsender,EventArgse) { timer2.Start(); string[]str=SerialPort.GetPortNames(); if(str==null) { MessageBox.Show("本机没有串口!","Error"); return; } comboBox1.Items.AddRange(str); comboBox1.SelectedIndex=0; comboBox2.SelectedIndex=1; comboBox4.SelectedIndex=2; comboBox5.SelectedIndex=2; this.toolStripStatusLabel1.Text="端口号:端口未打开"; this.toolStripStatusLabel2.Text="波特率:端口未打开"; this.toolStripStatusLabel3.Text="数据位:端口未打开"; this.toolStripStatusLabel4.Text="停止位:端口未打开"; intcount=comboBox1.Items.Count; //去除下拉框可选数据的重复项 inti; for(i=0;i<count;i++) { stringstrs=comboBox1.Items[i].ToString(); for(intj=i+1;j<count;j++) { stringstr1=comboBox1.Items[j].ToString(); if(str1==strs) { comboBox1.Items.RemoveAt(j);count--;j--; } } } } //打开串口 privatevoidbutton1_Click(objectsender,EventArgse) { Stringstr1=comboBox1.Text; Stringstr2=comboBox2.Text; Stringstr3=comboBox4.Text; Stringstr4=comboBox5.Text; Int32int2=Convert.ToInt32(str2); Int32int3=Convert.ToInt32(str3); try { if(str1==null) { MessageBox.Show("请先选择串口!","Error"); return; } serialPort1.PortName=str1; serialPort1.BaudRate=int2; serialPort1.DataBits=int3; switch(comboBox5.Text) { case"1": serialPort1.StopBits=StopBits.One; break; case"1.5": serialPort1.StopBits=StopBits.OnePointFive; break; case"2": serialPort1.StopBits=StopBits.Two; break; default: MessageBox.Show("Error:参数不正确","Error"); break; } if(serialPort1.IsOpen==true) { serialPort1.Close(); } serialPort1.DataReceived+=newSerialDataReceivedEventHandler(serialPort1_DataReceived); serialPort1.Open(); MessageBox.Show("串口打开成功!",str1); this.toolStripStatusLabel1.Text="端口号:"+serialPort1.PortName+""; this.toolStripStatusLabel2.Text="波特率:"+serialPort1.BaudRate+""; this.toolStripStatusLabel3.Text="数据位:"+serialPort1.DataBits+""; this.toolStripStatusLabel4.Text="停止位:"+serialPort1.StopBits+""; button1.Enabled=false; comboBox1.Enabled=false; comboBox2.Enabled=false; comboBox4.Enabled=false; comboBox5.Enabled=false; } catch(Exceptioner) { MessageBox.Show("Error:"+er.Message,"Error"); return; } } //关闭串口 privatevoidbutton2_Click(objectsender,EventArgse) { button1.Enabled=true; comboBox1.Enabled=true; comboBox2.Enabled=true; comboBox4.Enabled=true; comboBox5.Enabled=true; serialPort1.Close(); this.toolStripStatusLabel1.Text="端口号:"+serialPort1.PortName+""; this.toolStripStatusLabel2.Text="波特率:"+serialPort1.BaudRate+""; this.toolStripStatusLabel3.Text="数据位:"+serialPort1.DataBits+""; this.toolStripStatusLabel4.Text="停止位:"+serialPort1.StopBits+""; } privatevoidtoolStripMenuItem3_Click(objectsender,EventArgse) { Application.Exit(); } //发送 privatevoidbutton4_Click(objectsender,EventArgse) { if(button1.Enabled==true) { MessageBox.Show("请先打开串口","Error"); return; } Stringstr1; str1=textBox1.Text; byte[]data=Encoding.Default.GetBytes(str1); if(checkBox1.Checked==true) { for(inti=0;i<data.Length;i++) { bytetemp=data[i]; stringtempHex=temp.ToString("X2")+""; serialPort1.Write(tempHex); } } else { serialPort1.Write(data,0,data.Length); } } //使用Control.Invoke publicdelegatevoidDeleUpdateTextbox(stringdateRe); privatevoidserialPort1_DataReceived(objectsender,SerialDataReceivedEventArgse) { stringdataRe; byte[]byteRead=newbyte[serialPort1.BytesToRead]; DeleUpdateTextboxdeleupdatetextbox=newDeleUpdateTextbox(UpdateTextbox); serialPort1.Read(byteRead,0,byteRead.Length); if(checkBox2.Checked==false) { dataRe=Encoding.Default.GetString(byteRead); textBox2.Invoke(deleupdatetextbox,dataRe); } else { for(inti=0;i<byteRead.Length;i++) { bytetemp=byteRead[i]; dataRe=temp.ToString("X2")+""; textBox2.Invoke(deleupdatetextbox,dataRe); } } } privatevoidUpdateTextbox(stringdataRe) { if(iTextbox2==0) { this.textBox2.Text=dataRe; iTextbox2++; } else { textBox2.AppendText(dataRe); } } //发送文件 privatevoidbutton6_Click(objectsender,EventArgse) { stringstr3=textBox3.Text; if(button1.Enabled==true) { MessageBox.Show("请先打开串口","Error"); return; } if(str3=="") { MessageBox.Show("请选择要发送的文件!","Error"); return; } stringstr1; str1=textBox4.Text; timer1.Interval=Convert.ToInt32(str1); timer1.Start(); button2.Enabled=false; button3.Enabled=false; button4.Enabled=false; button5.Enabled=false; textBox1.Enabled=false; textBox3.Enabled=false; textBox4.Enabled=false; } //选择文件 privatevoidbutton8_Click(objectsender,EventArgse) { Stringfilename; openFileDialog1.FileName=""; openFileDialog1.ShowDialog(); filename=openFileDialog1.FileName; if(filename=="") { MessageBox.Show("请选择要发送的文件!","Error"); return; } textBox3.Text=filename; if(filename!=null) { sRead=newStreamReader(filename); } button5.Enabled=true; } //停止发送 privatevoidbutton7_Click(objectsender,EventArgse) { timer1.Stop(); button2.Enabled=true; button3.Enabled=true; button4.Enabled=true; textBox1.Enabled=true; textBox3.Enabled=true; textBox4.Enabled=true; } privatevoidtextBox1_KeyDown(objectsender,KeyEventArgse) { if(e.KeyValue==13) { if(button1.Enabled==true) { MessageBox.Show("请先打开串口!","Error"); return; } Stringstr1; str1=textBox1.Text; byte[]data=Encoding.Default.GetBytes(str1); serialPort1.Write(data,0,data.Length); textBox1.Clear(); } return; } //发送文件清屏 privatevoidbutton5_Click(objectsender,EventArgse) { textBox2.Clear(); iTextbox2=0; } //发送字符清屏 privatevoidbutton3_Click(objectsender,EventArgse) { textBox1.Clear(); iTextbox2=0; } privatevoidtextBox2_TextChanged(objectsender,EventArgse) { if(textBox2.Text.Length>0) { MessageBox.Show("条码长度:"+textBox2.Text.Length+"\n条码内容:"+textBox2.Text,"系统提示"); } } privatevoidtimer2_Tick(objectsender,EventArgse) { stringWeek=DateTime.Now.DayOfWeek.ToString(); switch(Week) { case"Sunday": Week="星期天"; break; case"Monday": Week="星期一"; break; case"Tuesday": Week="星期二"; break; case"Wednesday": Week="星期三"; break; case"Thursday": Week="星期四"; break; case"Friday": Week="星期五"; break; case"Saturday": Week="星期六"; break; } label6.Text=DateTime.Now.ToString()+""+Week; } } }