C#串口編程測試收發


原文: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虛擬串口軟件。大家可以去天空軟件站下載。

下載來安裝成功后如下圖所示: clip_image002 然后你就點擊添加端口,我上圖中的COM2和COM3就是VSPD添加的,這個時候你把COM2和Com3看做是一個真實的串口,然后用兩個軟件連接,就相當於一個串口了(我們可以用一個收,一個發:比如你的程序在接收com2,那么你用串口測試軟件連接com1發送,不能連接com2,會失敗的,因為這是虛擬的;串口測試軟件中要發送的數據是16進制的,以空格為分界不管有幾個空格,如果要發空格要發0A,注意不區分大小寫),我用一個串口測試器和我們自己編寫的軟件進行測試:如下圖所示,我們的串口測試器(網上搜下載簡便串口測試)已經連接到COM3上了, clip_image004

監聽串口程序

直接上代碼,在控制台程序中添加如下源碼就可以直接運行了:

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("-", " ");

        }

    }

}

   

clip_image006運行結果如下圖: 數據完全正確,發出的數據和接受的數據都一樣,而且此時VSDM的界面有簡單變化: clip_image008 總結:本文寫了一個用虛擬串口軟件編寫的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("-", " "); //

}

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM