c#学习笔记之串口通信【转】

c#学习笔记之串口通信

缘起:串口通信是一种常见的通信应用技术,无论是在工业控制还是生活上,很多场合都用到了串口通信。以前在vc下用MsComm控件对串口编程,到了c#下虽然同样可以注册该控件并使用,但既然是学习C#,就要用c#的方式对串口操作。

准备:写串口程序当然要能调试串口,如果电脑上有两个串口,直接买根交叉线或自己直接接3根线就能调试了。我比较懒,懒得去买线,不过懒人有懒办法,在网上找了个虚拟串口工具,网上有位老兄提供了vspd虚拟串口破解版,很好用,感谢下这位老兄。见网址http://hi.baidu.com/lk3721/blog/item/17221befb259631efcfa3c54.html。下载解压后直接运行,点击add添加一对串口,在使用的时候要成对使用添加的串口。我的电脑上就是com3com4。最后再下一个串口通信调试助手。

file>new>project,在如下界面中选择Windows Forms Application,在location处更改项目所在目录,点击ok 后确定。
.NET 提供了串口通信的功能,其命名空间是System.IO.Ports。因此先添加代码
using System.IO.Ports;
往主窗口上添加一个button控件button_send,在属性处改名为发送,添加两个richtextbox控件richTextBox_senddatarichTextBox_receivedata


初始化串口,这里为了简单在初始化的时候固化了串口的参数:
private SerialPort MyCom = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
双击发送按钮,添加事件
复制内容到剪贴板
代码:
private void button_send_Click(object sender, EventArgs e)
{
string ssendstr = "";
ssendstr = richTextBox_senddata.Text;
MyCom.Write(ssendstr); //发送
}
添加接收数据事件:
先将事件与事件处理程序关联
MyCom.DataReceived += new SerialDataReceivedEventHandler(MyCom_DataReceived);
在添加事件处理程序
复制内容到剪贴板
代码:

        public void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            sdata = sdata+MyCom.ReadExisting().ToString();
            showdata(sdata);
        }
添加显示数据方法
复制内容到剪贴板
代码:

       public void showdata(string sdata)
        {
            if (richTextBox_receivedata.InvokeRequired)
            {
                MyInvoke _myInvoke = new MyInvoke(showdata);
                this.Invoke(_myInvoke, new object[] { sdata });
            }
            else
            {
                    this.richTextBox_receivedata.Text = sdata;
            }
        }
需要委托委托
delegate void MyInvoke(string str);
最后添加一个清空接收按钮button_clean,双击添加相应事件。
复制内容到剪贴板
代码:

        private void button_clean_Click(object sender, EventArgs e)
        {
            sdata = "";
            showdata(sdata);
        }
至次一个简单的串口通信程序完成。由于程序固定为COM3,所以串口调试助手则应设为COM4(COM3和COM4为虚拟串口对)。

完整代码:
复制内容到剪贴板
代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            MyCom.Open(); //打开串口
            MyCom.DataReceived += new SerialDataReceivedEventHandler(MyCom_DataReceived); //
        }

        //定义串口并初始化。串口选择com3,波特率9600,校验位无,数据位8位,停止位1位
        private SerialPort MyCom = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

        delegate void MyInvoke(string str);
        

        string sdata = "" ;


        private void button_send_Click(object sender, EventArgs e)
        {
            string ssendstr = "";
            ssendstr = richTextBox_senddata.Text;
            MyCom.Write(ssendstr);
        }


        public void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            sdata = sdata+MyCom.ReadExisting().ToString();

            showdata(sdata);

        }

        public void showdata(string sdata)
        {
            if (richTextBox_receivedata.InvokeRequired)
            {
                MyInvoke _myInvoke = new MyInvoke(showdata);
                this.Invoke(_myInvoke, new object[] { sdata });
            }
            else
            {
                    this.richTextBox_receivedata.Text = sdata;
            }
        }

        private void button_clean_Click(object sender, EventArgs e)
        {
            sdata = "";
            showdata(sdata);
        }

    }
}
该程序只是在功能上实现了串口通信,为了人性化灵活操作,应该把串口、波特率、校验位、数据位、停止位等参数都提到界面上来。

posted @ 2009-12-10 21:48  chunchill  阅读(1378)  评论(0编辑  收藏  举报