使用SerialPort类设计串口通讯程序 (VS2005)

http://www.cnblogs.com/hocylan/archive/2008/03/13/1103624.html

 

一.概述

在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在Microsoft.Net技术广泛应用的今天,Visual Studio.Net没有将此控件加入控件库,所以人们采用了许多方法在Visual Studio.Net来编写串口通讯程序:第一种方法是通过采用Visual Studio 6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的Visual Studio 2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。NET Framework 2.0 类库包含了SerialPort 类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,本文着重讨论了Visual Studio 6.0的MSComm控件和SerialPort 类设计方法的异同点。
二.SerialPort常用属性、方法和事件
1.命名空间
System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步 I/O 和事件驱动的 I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using System.IO.Ports。
2.串口的通讯参数
串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和Settings。SerialPort类与MSComm有一些区别:
a.通讯端口号
[PortName]属性获取或设置通信端口,包括但不限于所有可用的 COM 端口,请注意该属性返回类型为String,不是Mscomm.CommPort的short类型。通常情况下,PortName正常返回的值为COM1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件中CommPort属性不能超过16的限止,大大方便了用户串口设备的配置。
b. 通讯格式
SerialPort类对分别用[BaudRate]、[Parity]、[DataBits]、[StopBits]属性设置通讯格式中的波特率、数据位、停止位和校验位,其中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parity类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚举了None、One、OnePointFive、Two。
SerialPort类提供了七个重载的构造函数,既可以对已经实例化的SerialPort对象设置上述相关属性的值,也可以使用指定的端口名称、波特率和奇偶校验位数据位和停止位直接初始化 SerialPort 类的新实例。
3.串口的打开和关闭
SerialPort类没有采用MSComm.PortOpen=True/False设置属性值打开关闭串口,相应的是调用类的Open()和Close()方法。
4. 数据的发送和读取
Serial类调用重载的Write和WriteLine方法发送数据,其中WriteLine可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法有许多,其中除了ReadExisting和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后,引发ReadExisting异常。
5.DataReceived事件
该事件类似于MSComm控件中的OnComm事件,DataReceived事件在接收到了[ReceivedBytesThreshold]设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。其中[ReceivedBytesThreshold]相当于MSComm控件的[Rthreshold]属性,该事件的用法与MsComm控件的OnComm事件在CommEvent为comEvSendcomEvEof时是一致的。
三.SerialPort的使用
对于熟悉MSComm控件的程序设计者,SerialPort类是相当容易上手的。在进行串口通讯时,一般的流程是设置通讯端口号及波特率、数据位、停止位和校验位,再打开端口连接,发送数据,接收数据,最后关闭端口连接这样几个步骤。
数据接收的设计方法在这里比较重要,采用轮询的方法比较浪费时间,在Visual Basic中的延时方法中一般会调用API并用DOEvents方法来处理,但程序不易控制,建议采用DataReceived事件触发的方法,合理的设置ReceivedBytesThreshold的值,若接收的是定长的数据,则将ReceivedBytesThreshold设为接收数据的长度,若接收数据的结尾是固定的字符或字符串则可采用ReadTo的方法或在DataReceived事件中判断接收的字符是否满足条件。
SerialPort类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。
由于DataReceived事件在辅线程被引发,当收到完整的一条数据,返回主线程处理或在窗体上显示时,请注意跨线程的处理,C#可采用控件异步委托的方法Control.BeginInvoke及同步委托的方法Invoke。
四.结束语
在.NET平台下熟练使用SerialPort 类,可以很好地开发出串口通讯类程序,对于过去使用MSComm控件设计了一些通讯程序,也可以将MSComm控件替换为SerialPort类,当然为了避免对以前的项目做大的改动,可以使用SerialPort类设计一些与MSComm控件具有相同接口的类,在今后工业控制中,SerialPort类将广泛地应用于串口通讯程序的设计中,发挥着与MSComm控件一样的作用。

Dec 5th

虽然连着几天晚睡,到这会儿还是要写点什么。心绪未宁。

S家HR来电话,和气的问为什么到现在还没有寄出签过字的offer第二页,只能照实说了。然后是一堆道歉的话,听到对面忍住怒气的再见,无奈的挂掉电话。也许,这是一个再好不过的机会。新成立的高规格研发中心,契合的背景,500强,可以在最短的时间内完成初期的职业发展,以及,在西安还算不错的薪水。HR姐姐,项目经理小帅哥,只有抱歉。一直说服自己留在西安吧,熟悉的城市,熟悉的景致,安宁的日子,还有……所有的理由,总是被更多的理由推倒。或者说,理由,都不是理由。因为梨说,老娘大人又去看她了……恋家,这该是我永恒的关键词吧。

到了这当口上,企业渐少,也越发懒得出门活动。北京某协会的电话,下午面试,算了,还是宅实验室吧,咱们的机器人越发的机灵了呢。来,姐姐给你安个天线。

浮躁的心思,什么都想做的心思,都随着寒流的到来沉淀下来。做什么工作,仿佛都成了无所谓的事情。爱我所择,用在这儿貌似也挺合适。

目前状况。33家公司:

  • 各种形式被拒的21家:其中被无视的11家,没过笔试1家,没过电面2家,没过一面6家,没过终面1家
  • 主动放弃的4家,
  • 拿到offer的2家,
  • 没开始的3家,
  • 开始但杳无音讯的1家,
  • 正在进行中的2家

VC++下用MSComm控件实现串口通讯

[来源]

首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project –> Add to Project –> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。

打开所需串口后,需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是 处理串行端口交互作用的一种非常有效的方法。使用 OnComm 事件和 CommEvent 属性捕捉并检查通讯事件和错误的值。发生通讯事件或错误时,将触发 OnComm 事件,CommEvent 属性的值将被改变,应用程序检查 CommEvent 属性值并作出相应的反应。

继续阅读VC++下用MSComm控件实现串口通讯

通信控件MSComm使用详解

[来源]

MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数, 而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过 串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

1.MSComm控件两种处理通讯的方式

MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。

1.1 事件驱动方式

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。

1.2 查询方式 继续阅读通信控件MSComm使用详解

重感冒

 

赶了两周场子的结果。
喝水,
水果,
清淡饮食,
不熬夜,
吃药,
……

暂时不往外赶了。
只是还是一点着落都没有。
加油吧,不到俩月,就能柳暗花明了~

秋色到了最浓的时候。
雨后的梧桐道,
黄叶铺成毯子,
静静的走,
温暖从手掌蔓延开来。

NEX5,
效果貌似还不错的样子。

目前申请状态

ABB中国管理培训生:2011.10.18 网上测试 2011.10.25 电话面试 2011.11.09 AC面 2011.12.09 终面 2011.12.13 通过终面 2011.12.14 口头offer 2011.12.15 书面offer 2011.12.16 accept

微策略技术支持:2011.10.08 网申+内推 2011.10.10 电面 2011.10.25 二面 2011.11.1 终面 2011.11.14 Offer  2011.11.20 accept 2011.12.1 三方

施耐德研发:2011.11.25 一面 2011.11.26 二面 2011.11.27 预录用 2011.11.30 Offer 2011.12.04 deny

中国银行总行:2011.12.04 笔试 2011.12.11 网上测试 2011.12.14 英语面试+综合面试+专业笔试

西门子管理培训生SGP:2011.10.13 电面 进入二面

GE航空系统工程师:2011.11.25 网申+师姐内推


继续阅读目前申请状态

雨,宿舍宅

网申到一半服务器又down掉。
不知道神马时候才能再连上。
又是一个做到一半的。
尾巴,尾巴,好多尾巴,令人烦躁的尾巴。

西安的这个秋天异常湿润。
天晴的日子总觉得不够的样子。
阴天,小雨,瓢泼大雨。。。
刚好配合这段湿哒哒的心情。
天气不好食欲反倒好得不得了。
阴霾的天气给心灵带来的缺口只能用大盘大盘的食物来弥补,
再加上没时间没机会骑车出去逛悠,
眼见着体重噌噌噌的往上涨,
山也看不下去说你该减肥了。

还是等手上有offer了再说。

旁边园园冷不丁来了句:
娃找工作找疯了。

秦岭的黄叶,还有缘分见到么?

Job hunting,继续

ABB笔试的系统一直进不去,输了给的账号和验证码登录后总显示登陆异常以及一大坨代码。于是坐等夜深人静之时做题。

果然,不赖的,刷到半夜终于进去了。

第一部分184道性格测试题,~40min内点完,每道题还有时间限制,到时间了自动刷新到下一题,和第二部分一样提交之后就不能返回更改了。

第二部分60道题,要在48min内做完。10道高考语文词语填空,10道逻辑判断,10道数字,10道力学,10道图形推理,后面10道。。。网页就刷不出来了。。。一直在刷。。。一直刷。。。

泪奔状,趁着人少的时候熬夜做笔试题的桑不起,脑子一团浆糊状,系统还各种状况。

第二部分感觉时间有点紧,不晓得是题难还是这个时候脑子不灵泛了。

 

懒得去想已经被几个公司鄙视了。

熬夜网申,熬夜写letter,熬夜笔试,熬夜。。。额头上得是起了多少褶子啊。这样的状态还要纠结多久涅?

据说找工作的平均时间为19周,那么从9月算起,到明年1月中才会有个着落。还有好久。。。

周围的人陆陆续续的有了些个归宿或者备分。手上还没一个offer,些微不淡定鸟。

继续加油吧。一堆deadline就在眼前。