1、请勿转载,我会不断的更新和修改。修改日志:1 20091112创建文档2 20091113发送函数介绍,数据的接收,上位机基本功能的完成一、创建 Windows 窗体项目二、添加 SerialPort 组件三、默认产生 serialPort1对象四、设置串口属性三种方法(本实例用第三种)1.设置下面的属性2.代码实现3.用我封装的一个类来实现C# 封装了用于对 Serialport 类属性的配置类及其保存窗五、串口操作(打开关闭)按上述步骤初始化串口之后进行串口的打开和关闭操作打开关闭串口的函数包含在 SerialPort 类中,利用 SerialPort 对象来引用serialPort1.O
2、pen(); serialPort1.Close();例如:在程序中添加一个打开串口按钮 btn_open,btn_open.Text 初始化为“打开串口“在 btn_open 响应函数中加入以下代码private void btn_open_Click(object sender, EventArgs e)if (btn_open.Text = “打开串口“)btn_open.Text = “关闭串口“;serialPort1.Open();elsebtn_open.Text = “打开串口“;serialPort1.Close();此时形成的界面截图如下:此时程序的代码如下:using S
3、ystem;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using AHRSmanager;namespace testOfserialPortpublic partial class Form1 : Formpublic Form1()InitializeComponent();private void seria
4、lPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)private void btn_SerialportSet_Click(object sender, EventArgs e)using (串口设置窗口 frmConfig = new 串口设置窗口()frmConfig.ShowDialog();private void btn_open_Click(object sender, EventArgs e)if (btn_open.Text = “打开串口“)串口设置窗口.ReadS
5、erialPortSet(serialPort1); /串口初始化btn_open.Text = “关闭串口“;serialPort1.Open();elsebtn_open.Text = “打开串口“;serialPort1.Close();private void Form1_Load(object sender, EventArgs e)btn_open.Text = “打开串口“;这时该程序已经具有开关串口的作用,可以用 单 PC 机虚拟串口互连方法 介绍的方法进行串口测试(串口互联模式)运行程序,点击串口配置按钮,进行参数配置,点击打开串口,VSPM 就将显示串口的打开和关闭.六、数
6、据的发送(一) 十六进制数据发送使用方法见 C#中用 SerialPort 类中的 Write()方法发送十六进制数1.为程序添加发送按钮,命名为 btn_send,为程序添加文本输入框 tb_send2.在 btn_send 的回调函数中添加以下代码private void btn_send_Click(object sender, EventArgs e)Byte BSendTemp = new Byte1; /建立临时字节数组对象BSendTemp0 = Byte.Parse(this.tb_send.Text);/由文本框读入想要发送的数据this.serialPort1.Write(
7、BSendTemp, 0, 1);/发送数据 3.测试将串口配置为 COM3,打开 VSPM 和串口调试助手,调试助手为 COM4打开串口 COM3,将要发送的数写入输入文本框(0-255) ,点击发送在串口调试助手中就会出现相应的十六进制数据显示(二) 字符串数据发送1 为程序添加 CheckBox cB_Hex,如若选中则发送 Hex 数据,如若未选则发送 String 数据。2 将 btn_send 的响应函数 btn_send_Click 修改为:private void btn_send_Click(object sender, EventArgs e)if (this.cB_Hex
8、.Checked = true)Byte BSendTemp = new Byte1; /建立临时字节数组对象BSendTemp0 = Byte.Parse(this.tb_send.Text);/由文本框读入想要发送的数据this.serialPort1.Write(BSendTemp, 0, 1);/发送数据 elsestring serialStringTemp = this.tb_send.Text;this.serialPort1.WriteLine(serialStringTemp);3 运行程序,取消 Checkbox 的选择4 发送字符串,下面为测试图5 这里主要利用了 Wri
9、teLine 函数,这个函数在 Console 中也有定义,用发基本一样。七、数据的接收(A)结构介绍数据的接收大体有两种方案:1 主动定时读取;2 事件响应驱动1 主动定时读取这种方式的适应能力较弱,当数据来源为定时并且不是很快的情况时可以考虑采用这种方法,这种方法主要适用于数据采集系统而不适用于随机事件发生时的通信或控制系统。当然,这种方法的缺点是如果接收的数据不是定时的,则读取定时器的触发频率就要很小,这样才能保证及时的读取串口缓冲区。这也将大大的浪费系统资源。 2 事件响应驱动这种方式是串口通信上位机制作的主要方式,其采用中断思想而成,当串口输入缓冲区中的字节数据大于某个设定的个数时,
10、触发串口输入中断,这时在中断程序中读取串口输入缓冲区中的数据,具有实时性和灵活性,是个常用的较好的方法。本文也是采用这种方法来进行串口输入缓冲区的实时数据读取。(B)事件响应驱动下的串口输入缓冲区数据读取.NET 中封装了 SerialPort 类 表示串行端口资源。 命名空间: System.IO.Ports程序集: System(在 System.dll 中)除了前面用到的串口常规属性设置(BuadRate,PortName) ,这里用到了一个新的串口属性:ReceivedBytesThreshold获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数。这个 Recei
11、veBytesThreshold 属性即是设置串口输入缓冲区中的数据字节大于ReceiveBytesThreshold 时触发 DataReceived 事件。用法:在设计器双击串口 serialport1的 DataReceived 事件,在代码中就会自动加入serialPort1_DataReceived 函数作为 DateReceived 的事件触发函数。作为测试,先将 serialport1.ReceiveBytesThreshold 设为1,即串口输入缓冲区有数就触发 DataReceived 事件。加入 RichTextBox rTB_receive 作为串口接收数据的显示组件在 DataReceived 事件响应函数中读取串口输入缓冲区中的数据string serialReadString;private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)