C#的SerialPort串口程序设计总结
Posted SherlockHolmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#的SerialPort串口程序设计总结相关的知识,希望对你有一定的参考价值。
简介:微软的VS提供了SerialPort控件,也就是串行端口资源。
当然也可以添加引用 using System.IO.Ports;
通过实例化SerialPort对象就可以使用其属性和方法了。
SerialPort serialPort1 = new SerialPort();
最重要的几个属性:
serialPort1.Open();打开串行端口连接
serialPort1.Close();关闭串行端口连接
serialPort1.PortName 获取或设置通信端口(COM)
serialPort1.BaudRate 获取或设置串行波特率
serialPort1.DataBits 获取或设置每个字节的标准数据位长度
serialPort1.StopBits 获取或设置每个字节的标准停止位数
serialPort1.Parity 获取或设置奇偶校验检查协议
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 数据接收事件的方法
简单的界面示例代码如下:
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.Timers; namespace WinFromApp { public partial class Form1 : Form { private StreamReader sRead; public int iTextbox2 = 0; SerialPort serialPort1 = new SerialPort(); public Form1() { InitializeComponent(); } private DateTime _dt = DateTime.Now; //定义一个成员函数用于保存每次的时间点 private void textBox2_KeyPress(object sender, KeyPressEventArgs e) { DateTime tempDt = DateTime.Now; //保存按键按下时刻的时间点 TimeSpan ts = tempDt .Subtract(_dt); //获取时间间隔 if (ts.Milliseconds > 50) //判断时间间隔,如果时间间隔大于50毫秒,则将TextBox清空 textBox2.Text = ""; _dt = tempDt ; } private void timer1_Tick(object sender, EventArgs e) { string str1; 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); } private void Form1_Load(object sender, EventArgs e) { 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 = "停止位:端口未打开"; int count = comboBox1.Items.Count; //去除下拉框可选数据的重复项 int i; for (i = 0; i < count; i++) { string strs = comboBox1.Items[i].ToString(); for (int j = i + 1; j < count; j++) { string str1 = comboBox1.Items[j].ToString(); if (str1 == strs) { comboBox1.Items.RemoveAt(j); count--; j--; } } } } //打开串口 private void button1_Click(object sender, EventArgs e) { String str1 = comboBox1.Text; String str2 = comboBox2.Text; String str3 = comboBox4.Text; String str4 = comboBox5.Text; Int32 int2 = Convert.ToInt32(str2); Int32 int3 = 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 += new SerialDataReceivedEventHandler(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(Exception er) { MessageBox.Show("Error:"+er.Message,"Error"); return; } } //关闭串口 private void button2_Click(object sender, EventArgs e) { 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 + ""; } private void toolStripMenuItem3_Click(object sender, EventArgs e) { Application.Exit(); } //发送 private void button4_Click(object sender, EventArgs e) { if (button1.Enabled == true) { MessageBox.Show("请先打开串口","Error"); return; } String str1; str1 = textBox1.Text; byte[] data = Encoding.Default.GetBytes(str1); if (checkBox1.Checked == true) { for (int i = 0; i < data.Length; i++) { byte temp = data[i]; string tempHex = temp.ToString("X2") + ""; serialPort1.Write(tempHex); } } else { serialPort1.Write(data,0,data.Length); } } //使用Control.Invoke public delegate void DeleUpdateTextbox(string dateRe); private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string dataRe; byte[] byteRead = new byte[serialPort1.BytesToRead]; DeleUpdateTextbox deleupdatetextbox = new DeleUpdateTextbox(UpdateTextbox); serialPort1.Read(byteRead, 0, byteRead.Length); if (checkBox2.Checked == false) { dataRe = Encoding.Default.GetString(byteRead); textBox2.Invoke(deleupdatetextbox, dataRe); } else { for (int i = 0; i < byteRead.Length; i++) { byte temp = byteRead[i]; dataRe = temp.ToString("X2") + ""; textBox2.Invoke(deleupdatetextbox, dataRe); } } } private void UpdateTextbox(string dataRe) { if (iTextbox2 == 0) { this.textBox2.Text = dataRe; iTextbox2++; } else { textBox2.AppendText(dataRe); } } //发送文件 private void button6_Click(object sender, EventArgs e) { string str3 = textBox3.Text; if (button1.Enabled == true) { MessageBox.Show("请先打开串口", "Error"); return; } if (str3 == "") { MessageBox.Show("请选择要发送的文件!", "Error"); return; } string str1; 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; } //选择文件 private void button8_Click(object sender, EventArgs e) { String filename; openFileDialog1.FileName = ""; openFileDialog1.ShowDialog(); filename = openFileDialog1.FileName; if(filename=="") { MessageBox.Show("请选择要发送的文件!","Error"); return; } textBox3.Text = filename; if (filename != null) { sRead = new StreamReader(filename); } button5.Enabled = true; } //停止发送 private void button7_Click(object sender, EventArgs e) { timer1.Stop(); button2.Enabled = true; button3.Enabled = true; button4.Enabled = true; textBox1.Enabled = true; textBox3.Enabled = true; textBox4.Enabled = true; } private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyValue == 13) { if (button1.Enabled == true) { MessageBox.Show("请先打开串口!", "Error"); return; } String str1; str1 = textBox1.Text; byte[] data = Encoding.Default.GetBytes(str1); serialPort1.Write(data, 0, data.Length); textBox1.Clear(); } return; } //发送文件清屏 private void button5_Click(object sender, EventArgs e) { textBox2.Clear(); iTextbox2 = 0; } //发送字符清屏 private void button3_Click(object sender, EventArgs e) { textBox1.Clear(); iTextbox2 = 0; } private void textBox2_TextChanged(object sender, EventArgs e) { if (textBox2.Text.Length > 0) { MessageBox.Show("条码长度:"+textBox2.Text.Length+"\n条码内容:"+textBox2.Text,"系统提示"); } } private void timer2_Tick(object sender, EventArgs e) { string Week = 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; } } }
以上是关于C#的SerialPort串口程序设计总结的主要内容,如果未能解决你的问题,请参考以下文章