目前,我在学习C#串口编程类的基础知识,在网上也找了一些资料,但都存在一些问题,现在他们基础上再进行一定的修改,且更详细的表达如何实现串口编程,实现串口的发送与接收。本文通过一个完整的实例,目的在于说明在win7系统中进行串口编程时:
1. 用C# 编程串口的属性定义、成员变量以及方法等问题;
2. 掌握串口的发送与接收,利用虚拟串口来进行通讯,体验串口通讯;
至于具体的串口通信原理,下一篇会具体介绍。
1.C#中的System.IO.Ports; (不过在vc下亦可以使用MSCOM)
1. 生成虚拟串口通信的工具:
xp系统下vspm下载地址:
http://download.csdn.net/source/1232967
win7系统下vspd下载地址:
http://www.qiujicai.com/content/uploadfile/201104/17ebdf6a475acba44e4fdd4c8e5d58ce20110421020034.rar
2. 辅助串口调试的工具---串口调试助手(即用于和自己写的窗口通信程序交互的软件)
表1 程序中使用的控件命名
控件名称 |
定义的id |
含义 |
下拉列表框 |
comboBox1 |
显示操作系统中可用的串口 |
“打开端口”按钮 |
Button3 |
打开选择的串口 |
“关闭端口”按钮 |
Button4 |
关闭选择的串口 |
细长的那个文本框 |
textBox1 |
提交发送的文本信息 |
“发送信息”按钮 |
button1 |
给串口发送文本 |
“接受信息”按钮 |
Button2 |
读取串口缓存的文本 |
巨大的显示框 |
listBox1 |
显示从串口读取的文本 |
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; using Microsoft.VisualBasic; namespace 串口 { public partial class Form1 : Form { System.IO.Ports.SerialPort com = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer(); foreach (string s in pc.Ports.SerialPortNames) { this.comboBox1.Items.Add(s); } } private void button3_Click(object sender, EventArgs e) { if (com == null) { com = new SerialPort(comboBox1.Text); } if (!com.IsOpen) { com.Open(); button3.Enabled = false; button4.Enabled = true; } } private void button4_Click(object sender, EventArgs e) { if (com != null && com.IsOpen) { com.Close(); button3.Enabled = true; button4.Enabled = false; } } private void button1_Click(object sender, EventArgs e) { Byte[] bytes = MyEncode(textBox1.Text.Trim()); com.Write(bytes, 0, bytes.Length); } private void button2_Click(object sender, EventArgs e) { Byte[] bytes = new Byte[com.ReadBufferSize]; com.Read(bytes, 0, bytes.Length); listBox1.Items.Add(MyDecode(bytes)); listBox1.SelectedIndex = listBox1.Items.Count - 1; MessageBox.Show(MyDecode(bytes)); } /// <summary> /// 编码 /// </summary> private Byte[] MyEncode(string text) { Encoder ed = Encoding.Default.GetEncoder(); char[] chars = text.ToCharArray(); Byte[] bytes = new Byte[ed.GetByteCount(chars, 0, chars.Length, true)]; ed.GetBytes(chars, 0, chars.Length, bytes, 0, true); //return Convert.ToBase64String(bytes); return bytes; } /// <summary> /// 解码 /// </summary> /// <param name="bytes"></param> /// <returns></returns> private string MyDecode(Byte[] bytes) { Decoder dd = Encoding.Default.GetDecoder(); char[] chars = new char[dd.GetCharCount(bytes, 0, bytes.Length, true)]; dd.GetChars(bytes, 0, bytes.Length, chars, 0, true); StringBuilder result = new StringBuilder(1000); foreach (char c in chars) { result.Append(c); } return result.ToString(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { button4.PerformClick(); } } }
1. 打开vspd软件,创建虚拟串口com2、com3,不要关闭软件(关闭时,虚拟串口就不存在了);
2. 运行自己的客户端软件,在comboBox1中选择新创建的串口com2,然后单击”打开端口”按钮;
3. 打开串口调试助手软件,选择与com2端口一同创建的com3端口,然后连接;
4. 在自定义客户端中输入文本,然后发送,即可在串口通信助手软件中看到收到的字符串信息;如果想看十六进制信息,就把左边的十六进制复选框中的对号勾上,以后就会显示十六进制的信息;
5. 可以在串口调试助手软件中,输入文本,单击“发送“按钮,然后在自定义客户端软件中单击”接受信息”,即可显示收到信息;
本文主要讲解win7系统中使用C#进行串口编程的步骤,对于在xp中使用C#进行串口开发的文章网上比较多,具体可以参考:
1.http://chowtrong.blog.163.com/blog/static/193026085201171932139652/
2.http://www.cnblogs.com/youchun/archive/2009/11/28/1612724.html
关于vspd的使用方可以参考:
1.http://www.qiujicai.com/?post=42
2.http://blog.sina.com.cn/s/blog_6163bdeb0102e8iy.html
关于vspm的使用可以参考:
1.http://wenku.baidu.com/view/b8f3b72d915f804d2b16c132.html
2.http://wenku.baidu.com/view/ed929b8202d276a200292ea1.html