通过串口发送手机短信(C#版)2

串口通信

  在 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()

  说明:打开事先设置好的端口

  示例:
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

  当所要求的软硬件都准备好后,我们就可以正式开始了。下面以我自己的测试用例为大家详细介绍。

    做什么事情都应该有计划,虽然我们的测试用例很简单,但还是画个简单的流程图:



  有了流程图,还只是明白了程序怎么运行,再看看界面,会让你更心动的了。


图二、短信终端 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, 调试应该没什么问题,不过上面还没有实际任何看得见的功能,仅仅是打开了串口而以。

你可能感兴趣的:(职场,手机,串口,短信,休闲)