利用 SerialPort 控件實現 PC 串口通信


整理參考自《Visual C#.NET 串口通信及測控應用典型實例》1.3 節 以及 一篇博文:C# 串口操作系列(1) -- 入門篇,一個標准的,簡陋的串口例子

硬件部分

如果是兩個串口設備,把其中一個的 2、3、5 引腳分別連接到另一個的 3、2、5 引腳即可。

如果是單個串口設備,則將其2、3引腳相連就行了。

如果沒有串口設備,可以使用軟件(Virtual Serial Port Driver)模擬串口。

硬件連接好之后,可以先下載一個“串口調試助手1”測試串口連接是否正常。

軟件部分

利用 .NET 平台下的 SerialPort 控件。

通信接收實現方式:

1. 查詢方式:通過一個計數器,定時查詢是否有可接受的內容。

界面如下:

image

實現代碼:

using System;
using System.Windows.Forms;

namespace QueryMode
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            spSend.PortName = "COM2";
            spSend.BaudRate = 9600;
            spSend.Open();
            spReceive.PortName = "COM3";
            spReceive.BaudRate = 9600;
            spReceive.Open();

            timerReceive.Start();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string dataToSend = txtSend.Text;
            if (dataToSend == "")
            {
                MessageBox.Show("發送數據不能為空");
            }
            else
            {
                spSend.Write(dataToSend);
            }
        }

        private void timerReceive_Tick(object sender, EventArgs e)
        {
            string dataReceived;
            dataReceived = spReceive.ReadExisting();
            txtRecevie.AppendText(dataReceived);
        }

        private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            spSend.Close();
            spReceive.Close();
        }
    }
}

2. 事件方式:利用 SerialPort 控件的 DataReceived 事件。

界面部分基本同上,只是不需要 timer 控件了。

實現代碼:

using System;
using System.Windows.Forms;

namespace EventMode
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            spSend.PortName = "COM2";
            spSend.BaudRate = 9600;
            spSend.Open();
            spReceive.PortName = "COM3";
            spReceive.BaudRate = 9600;
            spReceive.Open();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string dataToSend = txtSend.Text;
            if (dataToSend == "")
            {
                MessageBox.Show("發送數據不能為空");
            }
            else
            {
                spSend.Write(dataToSend);
            }
        }

        private void spReceive_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string dataReceived;
            dataReceived = spReceive.ReadExisting();
            this.Invoke((EventHandler)delegate
            {
                txtRecevie.AppendText(dataReceived);
            });
        }

        private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            spSend.Close();
            spReceive.Close();
        }
    }
}

需要說明的是,在 DataReceived 事件處理方法中,在用到主窗體的 TextBox 控件時,要通過控件的 invoke 方法,否則會出現線程間的操作問題:

image


注1:串口調試助手軟件主頁:http://www.gjwtech.com/(用 Chrome 打開時提醒“存在惡意軟件”,請謹慎操作。)

備選下載地址:http://pan.baidu.com/s/16AzRO(串口調試助手V2.2)

注2:程序完整解決方案下載:http://pan.baidu.com/s/1d4om3(VS2010 版)


免責聲明!

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



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