您的位置:首页 > 编程语言 > C#

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;
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;
}
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: