.NET的那些事儿(10)——利用C#.NET进行串口编程

来源:互联网 发布:算法导论第四版 豆瓣 编辑:程序博客网 时间:2024/06/14 23:20

总算最后时间把【智能水电表】的项目啃下来了,总体来说这个项目技术难点不是特别多,主要是一个实现串口通讯的问题,其次就是水电表数据协议的解析问题。目前已经开始在部署阶段了,利用休息时间将内容整理如下:

一、需求分析

1、水电表部署在家居中正常使用(当然水电表不是普通的家庭用表,而是智能家居用表,具有无线通信功能);

2、水电表通过无线通信协议将数据发送到家庭网关中;

3、家庭网关通过串口与PC机相连,通过串口通讯发给PC机接收;

4、PC机通过串口接收到网关传来的数据,进行解析显示,并存储在MySQL数据中(如何配置数据库已经在前面的文章给出,http://blog.csdn.net/rocket5725/archive/2010/01/05/5137152.aspx);

5、JSP页面读取MySQL中的数据,并显示;

6、烧录机顶盒内核,将JSP页面显示在电视机中。

二、串口编程

本项目的技术难点主要是获取串口数据,并依据现有的通信协议对数据包进行解析并显示。之前有做过类似的串口编程用于WSN,但是现在才发现代码冗余量太大,而且不易于扩展,现在将总体过程整理如下:

2.1 创建SerialPort实例

该步骤可以按照如下方式创建,当然也可以直接在工具箱中拖进SerialPort。

2.2 列举可用的串口名

窗口首次加载时,我们将获取计算机上所有可用的串口名称并将这些名称添加到ComboBox控件里面。双击窗体实现Form1_Load事件处理。

按照以下的方法经常会出现问题(比如不能获得正确的串口名称),后面通过查阅资料得出了以下的一个解决方案,首先需要引用Microsoft.VisualBasic,用以下遍历SerialPortNames,获得所有的串口:

注意还要添加DataReceived 事件:

2.3 打开串口

选择串口名后,用户点击【连接】按钮以打开所选择的端口,代码实现如下:

2.4 断开串口连接

断开串口连接只需要调用一个方法即可。

2.5 接收串口的数据

SerialPort类的一个良好的特性是,无需不断的查询数据是否已经到达,而只需处理DataReceived事件,它将在检测到数据到达时自动触发,不过,因为事件运行在独立的线程里,任何试图直接更新主窗体的尝试都会引发错误,因此,需要使用一个代理来更新主线程里的控件(这个尤为重要,否则一切都白搭)。

定义代理如下所示:

2.6 传输Unicode字符

默认情况下,SerialPort类只传输ASCII字符,这是通过SerialPort类的Encoding属性设置的,如果你想传输另一种语言,就需要设置SerialPort类的Encoding属性为Unicode,以保证数据的正常发送与接收。

2.7 串口发送数据

要通过串口向接收者发送数据,使用SerialPort类的Write()方法即可。

三、运行测试

由于今天图片上传功能暂时关闭,所以不能上传图片,所有的代码如下所示: