串口的定義,請自行瞭解. C#操作串口通訊在.Net強大類庫的支持下,只需要三個步驟: 1 創建 2 打開 3 發送/接受 1 創建: 1 串口通訊需用用到的命名空間如下: using System.IO.Ports; using System.IO; using System.IO.Ports; ...
串口的定義,請自行瞭解.
C#操作串口通訊在.Net強大類庫的支持下,只需要三個步驟:
1 創建
2 打開
3 發送/接受
1 創建:
1 串口通訊需用用到的命名空間如下:
using System.IO.Ports; using System.IO;
2 因為全局使用,所以聲明為全局變數
private SerialPort spSend = new SerialPort();
3 指定串口名稱
spSend.PortName = "COM1"; //繼續根據需要指定埠的波特率,校驗位等信息 //在例子中我們只指定名稱,其他的一概不管.
2 打開:
spSend.Open();
3 發送/接收
//發送 byte[] data = Encoding.ASCII.GetBytes("要發送的信息"); spSend.Write(data, 0, data.Length);
//接收 byte[] data = new byte[spSend.BytesToRead]; spSend.Read(data, 0, data.Length); String str = new ASCIIEncoding().GetString(data);//收取到的信息
好了,核心代碼就是這麼簡單,下麵看完整實例,
界面:
控制項名稱:
下拉框ComList 打開按鈕btnOpen 發送框 txtSend 發送按鈕btnSend 接收框txtInfo 另外還有一個定時器Timer1
完整源碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports;//需要的命名空間 using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace ChengChenXu.com.COMDemo { public partial class Form1 : Form { private SerialPort spSend = new SerialPort(); //全局變數 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //獲取本機串口列表 string[] comList = SerialPort.GetPortNames(); if (comList.Length == 0) MessageBox.Show("本機沒有任何串口"); //綁定串口列表到下拉列表,設置第一項為預設值 foreach (var com in comList) { ComList.Items.Add(com); } ComList.SelectedIndex = 0; //啟動定時器,用來接受信息,沒有使用多線程,更易於理解 timer1.Start(); } private void btnOpen_Click(object sender, EventArgs e) { if (ComList.Items.Count == 0) { MessageBox.Show("沒有發現串口"); return; } //判斷是打開操作還是關閉操作 if (btnOpen.Text == "打開串口") { if (!spSend.IsOpen) { //設置埠名稱 //這裡我們僅僅設置埠的名稱,其他的全部用預設. spSend.PortName = ComList.SelectedItem.ToString(); try { //打開串口 spSend.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); } //更新控制項狀態 this.btnOpen.Text = "關閉串口"; this.ComList.Enabled = false; } } else if(btnOpen.Text=="關閉串口") { //關閉串口 spSend.Close(); btnOpen.Text = "打開串口"; ComList.Enabled = true; } } private void btnSend_Click(object sender, EventArgs e) { //發送數據 //準備數據 這裡我們只實現發送ASCII碼 其他的可以先轉化為byte[]再發送 byte[] data = Encoding.ASCII.GetBytes(txtSend.Text); if (spSend.IsOpen) { try { //發送動作 參數三個分別為數據 起始偏移位置 長度 spSend.Write(data, 0, data.Length); } catch (Exception ex) { MessageBox.Show(ex.Message); } } else { MessageBox.Show("埠還未打開"); } } private void Receive() { //接收信息 先判斷是否為打開狀態 if (spSend.IsOpen) { //準備接收 byte[] data = new byte[spSend.BytesToRead]; //接受動作 spSend.Read(data, 0, data.Length); //把接收到的信息轉成字元串顯示到控制項里 this.txtInfo.Text += new ASCIIEncoding().GetString(data); } } private void timer1_Tick(object sender, EventArgs e) { //用定時器來定期執行接收動作 間隔100毫秒 Receive(); } } }
如何測試
串口通訊既然是通訊那麼肯定是需要兩方參與的,如何在單機進行測試呢?下麵給出幾個方法:
1 方法一 把電腦串口的2 3針鏈接起來,那麼接收方和發送方可以為同一個埠.因為2針負責發送,3針負責接收,連接起來即可形成迴路
2 使用兩臺電腦,用串口線相連
3 使用虛擬串口軟體,最簡單易用,這裡我們採用這個方法進行測試.
首先軟體下載:VirtualSerialPortDriver 下載地址: VirtualSerialPortDriver.rar
這個是一個收費軟體,半個月的試用期,需要的話可以搜索下是否有破解版
安裝好之後打開軟體,右側選擇好兩個準備互聯的串口然後點擊Add pair即可. 我選擇的是COM9和COM10 可以看到左邊Virtual ports下麵已經有了COM9和COM10了 他們已經可以實現通訊了
把DEMO編譯好之後,直接運行兩個實例: 一個選擇COM9 一個選擇COM10 然後都打開串口
現在已經可以互相發送信息了
由COM9發出的Send for COM9已經發送到COM10
COM9也已經接收到了COM10發出的信息Send for COM10
本例只用了最簡單的例子來演示串口通訊過程,簡化一切功能,只為更好理解.
源碼以及DEMO: ChengChenXu.com.COMDemo.rar
本文為博主原創,轉載請保留出處:
http://www.chengchenxu.com/Article/27/netchuankou