作者:veryhappy(wx.net)
在.NET 1.1版本中微软并没有封装一个串口操作的类,但是我们可以在网络上找到通过WIN32 API读写文件方式访问串口的开源类库,比如:JustinIO。但是最近笔者在写一个短信猫池(支持8块SIM,收发短信的硬件设备,RJ45接口)的操作类库时,发现使用JustinIO的类库并不能很好的操作这样的设备(注:该设备是通过TCP/IP方式虚拟COM口来操作的),会出现初始化串口不正常甚至导致开发机蓝屏这样的严重问题。但是如果使用微软的MSCOMM控件却能很好的操作这类的虚拟串口。在.NET 2.0中微软又提供了一个IO.Ports新的命名空间,其中包含了SerialPort类,一个简单快捷的串口操作类。所以笔者想直接用SerialPorts类来替代JustinIO的类来操作串口。
关于SerialPort的成员属性和方法,这里就不在详细写了,主要是微软的帮助写的更全,我写多了大家看着也没有意思。如果本机安装了MSDN 2005可以访问ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/T_System_IO_Ports_SerialPort_Members.htm来具体查看,如果没有安装可以访问在线的MSDN库http://msdn2.microsoft.com/en-us/library/system.io.ports.serialport(VS.80).aspx。但是在我的类库中使用比较多的方法是Open,Close,Write,ReadExisting,事件DataReceived等。
在以前利用JustinIO来读写串口操作的时候总要在string和byte数组中不断的转换,现在利用SerialPort这样的事情就交给类库去完成吧,我们就关心发送和接收到的ASCII编码的string类型内容。原来在实时读取接收到的短信内容的时候我们需要写一个死循环来自己处理,现在注册SerialPort的DataReceived事件来直接获得接收到的数据更为方便,还很少出错。
下面我就简要说明一下我的类库结构,最主要的SMS类完成了串口的全部操作,至于短信相关的PDU编码解码的方法类也是从网络上下载的开源类,这里就不再说明了,因为和我的主题也不相关。
在这里比较重要的几个方法做一个简要说明
/// <summary>
/// 执行AT命令
/// </summary>
/// <param name="p_ATCommand">命令</param>
/// <returns>结果字符串</returns>
private string ExeATCommand ( string p_ATCommand )
{……}
我们操作短信设备最主要的工作就是向它发送特定的AT指令,然后再获取相应的结果,分析结果内容再作出我们的判断。所以在这里我把发送AT指令并获取指令执行结果的过程写成了ExeATCommand方法,用来执行AT指令。比如我的测试串口是否正常工作的一个方法IsConnect就是先调用ExeATCommand方法,发送“AT”命令到串口,根据串口返回的信息,“OK”或是“ERROR”来确定是它是否正在连接工作。
调用方法,添加对KostechSMS.DLL的引用。
using KostechSMS;
SMS InstanceSMSObject = new SMS([串口], [速率], [短信中心号码], [重试次数], [延迟时间]);
InstanceSMSObject.IsSendMessage([号码], [内容]); // 发送短信
// 实时监听收到的短信
InstanceSMSObject.ReceiveMessageEvent += new SMS.ReceiveMessageHandle( [本地的方法] );
InstanceSMSObject.ListenPortStart(); // 开始监听,当收到短信时将自动通知[本地的方法]
最后说明一下我的开发软件环境:Windows Server 2003 Standard,.NET Framework 2.0,Visual Studio 2005,IIS6。最后生成的DLL在Windows和WEB上面测试收发均成功。