c#学习笔记之串口通信【转】
c#学习笔记之串口通信
缘起:串口通信是一种常见的通信应用技术,无论是在工业控制还是生活上,很多场合都用到了串口通信。以前在vc下用MsComm控件对串口编程,到了c#下虽然同样可以注册该控件并使用,但既然是学习C#,就要用c#的方式对串口操作。
准备:写串口程序当然要能调试串口,如果电脑上有两个串口,直接买根交叉线或自己直接接3根线就能调试了。我比较懒,懒得去买线,不过懒人有懒办法,在网上找了个虚拟串口工具,网上有位老兄提供了vspd虚拟串口破解版,很好用,感谢下这位老兄。见网址http://hi.baidu.com/lk3721/blog/item/17221befb259631efcfa3c54.html。下载解压后直接运行,点击add添加一对串口,在使用的时候要成对使用添加的串口。我的电脑上就是com3和com4。最后再下一个串口通信调试助手。
file—>new—>project,在如下界面中选择Windows Forms Application,在location处更改项目所在目录,点击ok 后确定。
.NET 提供了串口通信的功能,其命名空间是System.IO.Ports。因此先添加代码
using System.IO.Ports;
往主窗口上添加一个button控件button_send,在属性处改名为发送,添加两个richtextbox控件richTextBox_senddata和richTextBox_receivedata。
初始化串口,这里为了简单在初始化的时候固化了串口的参数:
private SerialPort MyCom = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
双击发送按钮,添加事件
先将事件与事件处理程序关联
MyCom.DataReceived += new SerialDataReceivedEventHandler(MyCom_DataReceived);
在添加事件处理程序
delegate void MyInvoke(string str);
最后添加一个清空接收按钮button_clean,双击添加相应事件。
完整代码:
准备:写串口程序当然要能调试串口,如果电脑上有两个串口,直接买根交叉线或自己直接接3根线就能调试了。我比较懒,懒得去买线,不过懒人有懒办法,在网上找了个虚拟串口工具,网上有位老兄提供了vspd虚拟串口破解版,很好用,感谢下这位老兄。见网址http://hi.baidu.com/lk3721/blog/item/17221befb259631efcfa3c54.html。下载解压后直接运行,点击add添加一对串口,在使用的时候要成对使用添加的串口。我的电脑上就是com3和com4。最后再下一个串口通信调试助手。
file—>new—>project,在如下界面中选择Windows Forms Application,在location处更改项目所在目录,点击ok 后确定。
.NET 提供了串口通信的功能,其命名空间是System.IO.Ports。因此先添加代码
using System.IO.Ports;
往主窗口上添加一个button控件button_send,在属性处改名为发送,添加两个richtextbox控件richTextBox_senddata和richTextBox_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,双击添加相应事件。
复制内容到剪贴板
至次一个简单的串口通信程序完成。由于程序固定为COM3,所以串口调试助手则应设为COM4(COM3和COM4为虚拟串口对)。代码:
private void button_clean_Click(object sender, EventArgs e)
{
sdata = "";
showdata(sdata);
}
完整代码:
复制内容到剪贴板
该程序只是在功能上实现了串口通信,为了人性化灵活操作,应该把串口、波特率、校验位、数据位、停止位等参数都提到界面上来。代码:
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);
}
}
}