串口通信
在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。
通常,在C#中实现串口通信,我们有四种方法:
第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。
第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑
第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能
在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。
在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:
打开串口:
函数原型:public void Open()
说明:打开事先设置好的端口
示例:<?XML:NAMESPACE PREFIX = O />
在C#中要实现串口通信,很多人都不知所措,在论坛上经常可以看到"怎么用MSCOMM实现串口通信"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。
通常,在C#中实现串口通信,我们有四种方法:
第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。
第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑
第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能
在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。
在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:
打开串口:
函数原型:public void Open()
说明:打开事先设置好的端口
示例:<?XML:NAMESPACE PREFIX = O />
using JustinIO; static JustinIO.CommPort ss_port = new JustinIO.CommPort(); ss_port.PortNum = COM1; // 端口号 ss_port.BaudRate = 19200; // 串口通信波特率 ss_port.ByteSize = 8; // 数据位 ss_port.Parity = 0; // 奇偶校验 ss_port.StopBits = 1;// 停止位 ss_port.ReadTimeout = 1000; // 读超时 try { if (ss_port.Opened) { ss_port.Close(); ss_port.Open(); // 打开串口 } else { ss_port.Open();// 打开串口 } return true; } catch(Exception e) { MessageBox.Show(" 错误: " + e.Message); return false; } |
写串口:
函数原型:public void Write(byte[] WriteBytes)
WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通信
示例:
ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌
读串口:
函数原型:public byte[] Read(int NumBytes)
NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换
示例:
string response = Encoding.ASCII.GetString(ss_port.Read(128)); //读取128个字节缓存
关闭串口:
函数原型:ss_port.Close()
示例:
ss_port.Close();
由于篇幅,以及串口通信涉及内容广泛,我在这里只讲这些。
在上面我们已经把终端短信所需的各种原始技术有所了解,是可以小试牛刀的时候了。
实践篇
在整个开始的时候,你要准备以下软硬件:
硬件:西门子3508或C35系列手机一个
西门子手机通信数据线一条
软件:VS.NET(C#)
短信编码类库(PDUdecoding.cs)
串口通信类库(JustinIO.cs)
当所要求的软硬件都准备好后,我们就可以正式开始了。下面以我自己的测试用例为大家详细介绍。
做什么事情都应该有计划,虽然我们的测试用例很简单,但还是画个简单的流程图:
<?XML:NAMESPACE PREFIX = V />
有了流程图,还只是明白了程序怎么运行,再看看界面,会让你更心动的了。
图二、短信终端C#版界面图
再不开始,就有人骂我了。下在我讲的开发环境是在VS.NET(C#)中。COME GO,GO…
步骤一、打开VS.NET,新建项目->Visual C#项目->Windows应用程序,名称中输入你的工程名就行啦,我的是smsForCsharp
步骤二、参照上面的界面图,设计你的程序界面,下面是我程序中各控件的主要属性
在整个开始的时候,你要准备以下软硬件:
硬件:西门子3508或C35系列手机一个
西门子手机通信数据线一条
软件:VS.NET(C#)
短信编码类库(PDUdecoding.cs)
串口通信类库(JustinIO.cs)
当所要求的软硬件都准备好后,我们就可以正式开始了。下面以我自己的测试用例为大家详细介绍。
做什么事情都应该有计划,虽然我们的测试用例很简单,但还是画个简单的流程图:
<?XML:NAMESPACE PREFIX = V />
有了流程图,还只是明白了程序怎么运行,再看看界面,会让你更心动的了。
图二、短信终端C#版界面图
再不开始,就有人骂我了。下在我讲的开发环境是在VS.NET(C#)中。COME GO,GO…
步骤一、打开VS.NET,新建项目->Visual C#项目->Windows应用程序,名称中输入你的工程名就行啦,我的是smsForCsharp
步骤二、参照上面的界面图,设计你的程序界面,下面是我程序中各控件的主要属性
控件名称
|
控件
Name
属性
|
说明
|
TextBox
|
targetNumber
|
接收手机号码
|
TextBox
|
CenterNumber
|
短信中心号
|
TextBox
|
smsState
|
发送短信后,返回的信息。注意设置控件为多行
|
TextBox
|
smsContent
|
短信内容,同样,注意设置为多行
|
ComboBox
|
ConnectPort
|
连接手机的端口,例:
COM1\COM2
|
ComboBox
|
ConnectBaudRate
|
串口连接的波特率,在串口通信中很重要的
|
Button
|
btnSend
|
发送按钮
|
Button
|
btnConnect
|
连接按钮,主要用于程序的初始化
|
Button
|
btnExit
|
退出按钮
|
步骤三、将PDUdecoding.cs与JustinIO.cs拷入刚刚新建工程目录,并打开解决方案资源管理器,右键添加现有项,选中两个文件就行了,这里再打开类视图,里面是不是多了两个类,JustinIO与SMS类啊,如图三,要是没有,那你再试。
图三,添加类后的类视图
步骤四、引用命名空间,用代码查看方式打开Form1.cs(这里以我电脑为准,如果你自己更改过,请以你电脑为准),在代码前面加上
using JustinIO; using SMS; using System.IO; using System.Text; |
步骤五、在smsFormCsharp类中,添加两个字段ss_port、sms,分别为JustinIO及SMS的对象,如下
步骤六、添加串口初始化代码,如下:
///
<
summary
>
/// 初始化串口 /// < /summary > public bool InitCom(string m_port, int m_baudrate) { ss_port.PortNum = m_port;// 串口号 ss_port.BaudRate = m_baudrate;// 波特率 ss_port.ByteSize = 8;// 数据位 ss_port.Parity = 0;// ss_port.StopBits = 1;// 停止位 ss_port.ReadTimeout = 1000;// 读超时 try { if (ss_port.Opened) { ss_port.Close(); ss_port.Open(); } else { ss_port.Open();// 打开串口 } return true; } catch(Exception e) { MessageBox.Show(" 错误: " + e.Message); return false; } } |
将上述代码直接拷入你的程序中,并确保添加在Main主函数的后面,按F5,调试应该没什么问题,不过上面还没有实际任何看得见的功能,仅仅是打开了串口而以。
转载于:https://blog.51cto.com/cnming/223680