原文:http://www.cnblogs.com/vsdot/archive/2013/04/23/3263348.html
基本傳遞方法:RS232傳輸要有1位起始位,8位數據位、1位校驗位(可選)、1位停止位,也就是說傳一個字節要用時11位的時間.
舉例:6個字節要6*11=66位時間。每位1/9600秒,共用66/9600=0.006875秒。
虛擬串口軟件
當我們沒有設備時我們可以用虛擬串口軟件來模擬串口操作。下面我來介紹一款軟件VSPD虛擬串口軟件。大家可以去天空軟件站下載。
下載來安裝成功后如下圖所示:
然后你就點擊添加端口,我上圖中的COM2和COM3就是VSPD添加的,這個時候你把COM2和Com3看做是一個真實的串口,然后用兩個軟件連接,就相當於一個串口了(我們可以用一個收,一個發:比如你的程序在接收com2,那么你用串口測試軟件連接com1發送,不能連接com2,會失敗的,因為這是虛擬的;串口測試軟件中要發送的數據是16進制的,以空格為分界不管有幾個空格,如果要發空格要發0A,注意不區分大小寫),我用一個串口測試器和我們自己編寫的軟件進行測試:如下圖所示,我們的串口測試器(網上搜下載簡便串口測試)已經連接到COM3上了, 
監聽串口程序
直接上代碼,在控制台程序中添加如下源碼就可以直接運行了:
using System;
using System.IO.Ports;
using System.Text;
namespace PortDataReceived
{
class PortDataReceived
{
public static void Main()
{
SerialPort mySerialPort = new SerialPort("COM2");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
Console.WriteLine("Press any key to continue...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(StrToHex(indata));
}
public static string StrToHex(string mStr) //返回處理后的十六進制字符串
{
return BitConverter.ToString(ASCIIEncoding.Default.GetBytes(mStr)).Replace("-", " ");
}
}
}
運行結果如下圖: 數據完全正確,發出的數據和接受的數據都一樣,而且此時VSDM的界面有簡單變化:
總結:本文寫了一個用虛擬串口軟件編寫的C#串口編程實例。希望對大家有幫助。
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
namespace 串口收發測試
{
class Program
{
static void Main(string[] args)
{
SerialPort mySerialPort = new SerialPort("COM2");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
//mySerialPort.WriteLine("A"); //這是發送,com1收到41 0A
mySerialPort.Write("A"); //這是發送,com1收到41
Console.WriteLine("串口COM2已打開,按任意鍵關閉程序... ...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received 1:"+indata);
Console.WriteLine("Data Received 2:" + StrToHex(indata));
}
public static string StrToHex(string mStr) //返回處理后的十六進制字符串
{
//先專為10進制,在專為16進制
return BitConverter.ToString(ASCIIEncoding.Default.GetBytes(mStr)).Replace("-", " "); //
}
}
}
