c#serialport類實現串口通信的源代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace TestSerialPort
{
public partial class frmTESTSerialPort : Form
{
public frmTESTSerialPort()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private Button button1;
private TextBox txtSend;
private TextBox txtReceive;
private Label label1;
private Label label2;

/// <summary>
/// 必需的設計器變量。
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
/// <param name="disposing">如果應釋放託管資源,爲 true;否則爲 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows 窗體設計器生成的代碼

/// <summary>
/// 設計器支持所需的方法 - 不要
/// 使用代碼編輯器修改此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.txtSend = new System.Windows.Forms.TextBox();
this.txtReceive = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(440, 379);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "發送";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// txtSend
//
this.txtSend.Location = new System.Drawing.Point(59, 12);
this.txtSend.Multiline = true;
this.txtSend.Name = "txtSend";
this.txtSend.Size = new System.Drawing.Size(456, 164);
this.txtSend.TabIndex = 2;
//
// txtReceive
//
this.txtReceive.Location = new System.Drawing.Point(59, 200);
this.txtReceive.Multiline = true;
this.txtReceive.Name = "txtReceive";
this.txtReceive.Size = new System.Drawing.Size(456, 164);
this.txtReceive.TabIndex = 2;
//
// label1
//
this.label1.Location = new System.Drawing.Point(13, 15);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(41, 12);
this.label1.TabIndex = 0;
this.label1.Text = "發送";
//
// label2
//
this.label2.Location = new System.Drawing.Point(13, 213);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(41, 12);
this.label2.TabIndex = 0;
this.label2.Text = "接收";
//
// frmTESTSerialPort
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(546, 434);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.txtReceive);
this.Controls.Add(this.txtSend);
this.Controls.Add(this.button1);
this.Name = "frmTESTSerialPort";
this.Text = "串口試驗";
this.ResumeLayout(false);
this.PerformLayout();

}

#endregionprivate void button1_Click(object sender, EventArgs e)
{
//實例化串口對象(默認:COMM1,9600,e,8,1) 
SerialPort serialPort1 = new SerialPort();
//更改參數
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 19200;
serialPort1.Parity = Parity.Odd;
serialPort1.StopBits = StopBits.Two;

//上述步驟可以用在實例化時調用SerialPort類的重載構造函數
//SerialPort serialPort = new SerialPort("COM1", 19200, Parity.Odd, StopBits.Two);

//打開串口(打開串口後不能修改端口名,波特率等參數,修改參數要在串口關閉後修改)
serialPort1.Open();

//發送數據
SendStringData(serialPort1);
//也可用字節的形式發送數據
//SendBytesData(serialPort1);

//開啓接收數據線程
ReceiveData(serialPort1);

}



//發送字符串數據
private void SendStringData(SerialPort serialPort)
{
serialPort.Write(txtSend.Text);
}

/// <summary>
/// 開啓接收數據線程
/// </summary>
private void ReceiveData(SerialPort serialPort)
{
//同步阻塞接收數據線程
Thread threadReceive=new Thread(new ParameterizedThreadStart(SynReceiveData));
threadReceive.Start(serialPort);

//也可用異步接收數據線程
//Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(AsyReceiveData));
//threadReceiveSub.Start(serialPort);

}

//發送二進制數據
private void SendBytesData(SerialPort serialPort)
{
byte[] bytesSend=System.Text.Encoding.Default.GetBytes(txtSend.Text );
serialPort.Write(bytesSend, 0, bytesSend.Length);
}

//同步阻塞讀取
private void SynReceiveData(object serialPortobj)
{
SerialPort serialPort = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(0);
serialPort.ReadTimeout = 1000;
try
{
//阻塞到讀取數據或超時(這裏爲2秒)
byte firstByte=Convert.ToByte(serialPort.ReadByte());
int bytesRead=serialPort.BytesToRead ; 
byte[] bytesData=new byte[bytesRead+1];
bytesData[0] = firstByte;
for (int i = 1; i <=bytesRead; i++)
bytesData = Convert.ToByte( serialPort.ReadByte());
txtReceive.Text = System.Text.Encoding.Default.GetString(bytesData);
}
catch(Exception e)
{
MessageBox.Show(e.Message);
//處理超時錯誤
}

serialPort.Close();

}

//異步讀取
private void AsyReceiveData(object serialPortobj)
{
SerialPort serialPort = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(500);
try
{
txtReceive.Text = serialPort.ReadExisting();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
//處理錯誤
}
serialPort.Close();
}

}


static class Program
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmTESTSerialPort());
}
}

}

轉自:

http://blog.sina.com.cn/s/blog_4a5e327701008880.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章