欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# SerialPort實(shí)現(xiàn)串口通訊的代碼詳解

 更新時(shí)間:2024年06月24日 10:27:01   作者:碼農(nóng)浩克  
在.NET平臺(tái)下創(chuàng)建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空間是System.IO.Ports,這個(gè)新的框架不但可以訪問(wèn)計(jì)算機(jī)上的串口,還可以和串口設(shè)備進(jìn)行通信,本文給大家介紹了C# SerialPort實(shí)現(xiàn)串口通訊,需要的朋友可以參考下

串口通信

在.NET平臺(tái)下創(chuàng)建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空間是System.IO.Ports。這個(gè)新的框架不但可以訪問(wèn)計(jì)算機(jī)上的串口,還可以和串口設(shè)備進(jìn)行通信。

創(chuàng)建C#串口通信程序之命名空間 System.IO.Ports命名空間中最重用的是SerialPort 類。 創(chuàng)建C#串口通信程序之創(chuàng)建SerialPort 對(duì)象 通過(guò)創(chuàng)建SerialPort 對(duì)象,我們可以在程序中控制串口通信的全過(guò)程。

正文

屬性

BaseStream獲取 Stream 對(duì)象的基礎(chǔ) SerialPort 對(duì)象。
BaudRate獲取或設(shè)置串行波特率。
BreakState獲取或設(shè)置中斷信號(hào)狀態(tài)。
BytesToRead獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。
BytesToWrite獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。
CDHolding獲取端口的載波檢測(cè)行的狀態(tài)。
CtsHolding獲取“可以發(fā)送”行的狀態(tài)。
DataBits獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長(zhǎng)度。
DiscardNull獲取或設(shè)置一個(gè)值,該值指示 null 字節(jié)在端口和接收緩沖區(qū)之間傳輸時(shí)是否被忽略。
DsrHolding獲取數(shù)據(jù)設(shè)置就緒 (DSR) 信號(hào)的狀態(tài)。
DtrEnable獲取或設(shè)置一個(gè)值,該值在串行通信過(guò)程中啟用數(shù)據(jù)終端就緒 (DTR) 信號(hào)。
Encoding獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼。
Handshake使用 Handshake 中的值獲取或設(shè)置串行端口數(shù)據(jù)傳輸?shù)奈帐謪f(xié)議。
IsOpen獲取一個(gè)值,該值指示 SerialPort 對(duì)象的打開(kāi)或關(guān)閉狀態(tài)。
NewLine獲取或設(shè)置用于解釋 ReadLine() 和 WriteLine(String) 方法調(diào)用結(jié)束的值。
Parity獲取或設(shè)置奇偶校驗(yàn)檢查協(xié)議。
ParityReplace獲取或設(shè)置一個(gè)字節(jié),該字節(jié)在發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí)替換數(shù)據(jù)流中的無(wú)效字節(jié)。
PortName獲取或設(shè)置通信端口,包括但不限于所有可用的 COM 端口。
ReadBufferSize獲取或設(shè)置 SerialPort 輸入緩沖區(qū)的大小。
ReadTimeout獲取或設(shè)置讀取操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)。
ReceivedBytesThreshold獲取或設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù)。
RtsEnable獲取或設(shè)置一個(gè)值,該值指示在串行通信中是否啟用請(qǐng)求發(fā)送 (RTS) 信號(hào)。
StopBits獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)停止位數(shù)。
WriteBufferSize獲取或設(shè)置串行端口輸出緩沖區(qū)的大小。
WriteTimeout獲取或設(shè)置寫(xiě)入操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)。

方法

Close()關(guān)閉端口連接,將 IsOpen 屬性設(shè)置為 false,并釋放內(nèi)部 Stream 對(duì)象。
DiscardInBuffer()丟棄來(lái)自串行驅(qū)動(dòng)程序的接收緩沖區(qū)的數(shù)據(jù)。
DiscardOutBuffer()丟棄來(lái)自串行驅(qū)動(dòng)程序的傳輸緩沖區(qū)的數(shù)據(jù)。
GetPortNames()獲取當(dāng)前計(jì)算機(jī)的串行端口名的數(shù)組。
Open()打開(kāi)一個(gè)新的串行端口連接。
Read(Byte[], Int32, Int32)從 SerialPort 輸入緩沖區(qū)讀取一些字節(jié)并將那些字節(jié)寫(xiě)入字節(jié)數(shù)組中指定的偏移量處。
Read(Char[], Int32, Int32)從 SerialPort 輸入緩沖區(qū)中讀取一些字符,然后將這些字符寫(xiě)入字符數(shù)組中指定的偏移量處。
ReadByte()從 SerialPort 輸入緩沖區(qū)中同步讀取一個(gè)字節(jié)。
ReadChar()從 SerialPort 輸入緩沖區(qū)中同步讀取一個(gè)字符。
ReadExisting()在編碼的基礎(chǔ)上,讀取 SerialPort 對(duì)象的流和輸入緩沖區(qū)中所有立即可用的字節(jié)。
ReadLine()一直讀取到輸入緩沖區(qū)中的 NewLine 值。
ReadTo(String)一直讀取到輸入緩沖區(qū)中的指定 value 的字符串。
Write(Byte[], Int32, Int32)使用緩沖區(qū)中的數(shù)據(jù)將指定數(shù)量的字節(jié)寫(xiě)入串行端口。
Write(Char[], Int32, Int32)使用緩沖區(qū)中的數(shù)據(jù)將指定數(shù)量的字符寫(xiě)入串行端口。
Write(String)將指定的字符串寫(xiě)入串行端口。
WriteLine(String)將指定的字符串和 NewLine 值寫(xiě)入輸出緩沖區(qū)。

Nuget 安裝System.IO.Ports

圖片

串口寫(xiě)

private void btnWrite_Click(object sender, EventArgs e)
{
    SerialPort serialPort = new SerialPort();
    serialPort.PortName = "COM1";//串口名稱
    serialPort.BaudRate = 9600; //獲取或設(shè)置波特率
    serialPort.Parity = Parity.Even;//獲取或設(shè)置校驗(yàn)位
    serialPort.DataBits = 8;//獲取或設(shè)置數(shù)據(jù)位默認(rèn)值8
    serialPort.StopBits = StopBits.One;// 停止位
    serialPort.Open();
    serialPort.Write("A");
    serialPort.Close();
}

串口讀

SerialPort serialPort = new SerialPort();
private void btnRead_Click(object sender, EventArgs e)
{


    byte[] a = System.Text.Encoding.ASCII.GetBytes(" ");
    serialPort.PortName = "COM1";//串口名稱
    serialPort.BaudRate = 9600; //獲取或設(shè)置波特率
    serialPort.Parity = Parity.None;//獲取或設(shè)置校驗(yàn)位
    serialPort.DataBits = 8;//獲取或設(shè)置數(shù)據(jù)位默認(rèn)值8
    serialPort.StopBits = StopBits.One;// 停止位
    serialPort.DataReceived += SerialPort_DataReceived;
    serialPort.Open();
}


private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] b = new byte[8];
    int A = serialPort.Read(b, 0, 8);
    this.Invoke(() =>
    {
        string s = ByteToHex(b);
        txtValue.Text += s+System.Environment.NewLine;
    });
}


public string ByteToHex(byte[] Bytes)
{
    string str = string.Empty;
    foreach (byte Byte in Bytes)
    {
        str += String.Format("{0:X2}", Byte) + " ";
    }
    return str.Trim();
}

圖片

一個(gè)完整例子

圖片

using System.IO.Ports;


namespace SCOM
{
    public partial class FrmMain : Form
    {
        SerialPort serialPort;
        public FrmMain()
        {
            InitializeComponent();
            Init();
        }


        private void LoadPorts()
        {
            cboPort.Items.Clear();
            string[] port = System.IO.Ports.SerialPort.GetPortNames();
            foreach (var item in port)
            {
                cboPort.Items.Add(item);
            }
            cboPort.SelectedIndex = 0;
        }


        private void Init()
        {
            LoadPorts();
            object[] baudRate = { 4800, 9600, 19200, 38400, 57600, 115200, 230400 };
            cboBaudRate.Items.AddRange(baudRate);
            cboBaudRate.SelectedIndex = 1;


            cboDataBits.Items.Add(7);
            cboDataBits.Items.Add(8);
            cboDataBits.SelectedIndex = 1;


            cboStopBits.Items.Add("One");
            cboStopBits.Items.Add("OnePointFive");
            cboStopBits.Items.Add("Two");
            cboStopBits.SelectedIndex = 0;


            //Parity
            cboParity.Items.Add("None");
            cboParity.Items.Add("Even");
            cboParity.Items.Add("Mark");
            cboParity.Items.Add("Odd");
            cboParity.Items.Add("Space");
            cboParity.SelectedIndex = 0;


            cboHandshaking.Items.Add("None");
            cboHandshaking.Items.Add("XOnXOff");
            cboHandshaking.Items.Add("RequestToSend");
            cboHandshaking.Items.Add("RequestToSendXOnXOff");
            cboHandshaking.SelectedIndex = 0;
            btnClosePort.Enabled = false;
        }


        private void btnRefresh_Click(object sender, EventArgs e)
        {
            LoadPorts();
        }


        private void btnOpenPort_Click(object sender, EventArgs e)
        {
            if (serialPort == null)
            {
                serialPort = new SerialPort();
            }
            serialPort.PortName = cboPort.Text;//串口名稱
            serialPort.BaudRate = int.Parse(cboBaudRate.Text); //獲取或設(shè)置波特率
            serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text);//獲取或設(shè)置校驗(yàn)位
            serialPort.DataBits = int.Parse(cboDataBits.Text);//獲取或設(shè)置數(shù)據(jù)位默認(rèn)值8
            serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text);// 停止位
            serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHandshaking.Text);// 握手協(xié)議
            serialPort.DataReceived += SerialPort_DataReceived;
            serialPort.Open();
            stsMain_lblStatus.Text = "端口已打開(kāi)";
            btnOpenPort.Enabled = false;
            btnClosePort.Enabled = true;
        }


        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            this.Invoke(new Action(() =>
            {
                byte[] b = new byte[8];
                int A = serialPort.Read(b, 0, 8);
                string s = "";
                if (rdoHex.Checked)
                {
                    s = ByteToHex(b);
                }
                else
                {
                    s = System.Text.Encoding.Default.GetString(b);
                }
                txtReceive.AppendText(System.Environment.NewLine+ s);
            }));
        }


        private void btnClosePort_Click(object sender, EventArgs e)
        {
            if (serialPort != null && serialPort.IsOpen)
            {
                serialPort.DataReceived -= SerialPort_DataReceived;
                serialPort.Close();
                stsMain_lblStatus.Text = "端口已關(guān)閉";
                btnOpenPort.Enabled = true;
                btnClosePort.Enabled = false;
            }
        }


        private void btnSend_Click(object sender, EventArgs e)
        {
            if (serialPort == null || !serialPort.IsOpen)
            {
                return;
            }
            serialPort.Write(txtSend.Text);
        }


        private string ByteToHex(byte[] Bytes)
        {
            string str = string.Empty;
            foreach (byte Byte in Bytes)
            {
                str += String.Format("{0:X2}", Byte) + " ";
            }
            return str.Trim();
        }
    }
}



以上就是C# SerialPort實(shí)現(xiàn)串口通訊的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于C# SerialPort串口通訊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論