亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

串口通信

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

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

正文

屬性

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

方法

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

Nuget 安裝System.IO.Ports

圖片

串口寫

private void btnWrite_Click(object sender, EventArgs e)
{
    SerialPort serialPort = new SerialPort();
    serialPort.PortName = "COM1";//串口名稱
    serialPort.BaudRate = 9600; //獲取或設(shè)置波特率
    serialPort.Parity = Parity.Even;//獲取或設(shè)置校驗位
    serialPort.DataBits = 8;//獲取或設(shè)置數(shù)據(jù)位默認值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è)置校驗位
    serialPort.DataBits = 8;//獲取或設(shè)置數(shù)據(jù)位默認值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();
}

圖片

一個完整例子

圖片

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è)置校驗位
            serialPort.DataBits = int.Parse(cboDataBits.Text);//獲取或設(shè)置數(shù)據(jù)位默認值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 = "端口已打開";
            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實現(xiàn)串口通訊的代碼詳解的詳細內(nèi)容,更多關(guān)于C# SerialPort串口通訊的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論