利用 SerialPort 控件实现 PC 串口通信_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 利用 SerialPort 控件实现 PC 串口通信

利用 SerialPort 控件实现 PC 串口通信

 2013/11/23 21:29:05  古木月影  博客园  我要评论(0)
  • 摘要:整理参考自《VisualC#.NET串口通信及测控应用典型实例》1.3节以及一篇博文:C#串口操作系列(1)--入门篇,一个标准的,简陋的串口例子。硬件部分如果是两个串口设备,把其中一个的2、3、5引脚分别连接到另一个的3、2、5引脚即可。如果是单个串口设备,则将其2、3引脚相连就行了。如果没有串口设备,可以使用软件(VirtualSerialPortDriver)模拟串口。硬件连接好之后,可以先下载一个“串口调试助手1”测试串口连接是否正常。软件部分利用
  • 标签:实现 利用 控件 RIA

整理参考自《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 版)

发表评论
用户名: 匿名