`
zrj_software
  • 浏览: 200555 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

.net里使用MSComm控件发生短信

    博客分类:
  • C#
阅读更多

一.MSComm32.ocx控件(以下简称MSComm控件)

 

  1. MSComm控件是windows系统下的一个控件,可以实现串口通讯。该文件存在于windows\system32目录下。使用这个控件还需要修改注册表,HKEY_CLASSES_ROOT\Licenses = Licensing: Copying the keys may be a violation of established copyrights

  2. 如果您的系统提示"找不到mscomm32.ocx""mscomm32.ocx缺失" 或者"mscomm32.ocx错误"等等,请把mscomm32.ocx下载到本机。

  3. 直接拷贝该文件到系统目录里:

 

  1. Windows 95/98/Me系统,将mscomm32.ocx复制到:/Windows/System目录下。

  2. Windows NT/2000系统,将mscomm32.ocx复制到C:/WINNT/System32目录下。

  3. Windows XP/WIN7系统,将mscomm32.ocx复制到C:/Windows/System32目录下。

  4. 然后打开"开始-运行-输入regsvr32 mscomm32.ocx",回车即可!

 

  1. 注册完mscomm32.ocx后,在.net上就可以直接添加引用Interop.MSCommLib.dll,添加完后即可对com口进行操作了。

二.MSComm控件控件的使用

  1. MSComm控件的常用属性

 

  1. CommPort 设置并返回通讯端口号。

    语法:object.CommPort[=value ] (value 一整型值,说明端口号。)

    说明:在设计时,value 可以设置成从 1 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。

    注意:必须在打开端口之前设置 CommPort 属性。

     

  2. Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

    语法: object.Settings[ = value]

    说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。Value 由四个设置值组成,有如下的格式:"BBBB,P,D,S"

    BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:"9600,N,8,1"

  3. InputLen 属性:设置并返回 Input 属性从接收缓冲区读取的字符数。语法 object.InputLen [ = value]

 

InputLen 属性语法包括下列部分:value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。

 

说明:InputLen 属性的缺省值是 0。设置 InputLen 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ("")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。

 

  1. PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。

  2. Input 从接收缓冲区返回和删除字符。 (16进制数据)

  3. Output 向传输缓冲区写一个字符串。(16进制数据)

  4. RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 产生 OnComm 之前,设置并返回的要接收的字符数。

    语法:object.Rthreshold [ = value ]value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 )

    说明:当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。

  5. SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。

    语法:object.SThreshold [ = value ],value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。

    说明:若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。如果在传输缓冲区中的字符数小于 valueCommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。

  6. EOFEnable 属性:确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF) 字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF

    语法:object.EOFEnable [ = value ]

    EOFEnable 属性语法包括下列部分:

    value 布尔表达式,确定当找到 EOF 字符时,OnComm 事件是否被激活,如设置值中所描述。

    value 的设置值:

    True EOF 字符找到时 OnComm 事件被激活。

    False (缺省)当 EOF 字符找到时 OnComm 事件不被激活。

    说明:当 EOFEnable 属性设置为 FalseOnComm 控件将不在输入流中寻找 EOF 字符。

三.示例

 

初始化MSComm控件

 

private static MSCommLib.MSCommClass smsClass = null;

 

  1. private static void InitComm()

  2.         {

  3.             if (_sCommState == 1)//已初始化则不需再初始化返回

  4.                 return;

  5.             try

  6.             {

  7.                 smsClass = new MSCommClass();

  8.                 smsClass.CommPort = short.Parse(SmsSetting.SmsPort);

  9.                 smsClass.Settings = SmsSetting.Smsbit + ",N,8,1";

  10.                 smsClass.InputLen = 0;

  11.                 smsClass.RThreshold = 1;

  12.                 smsClass.OnComm += new DMSCommEvents_OnCommEventHandler(smsClass_OnComm);

  13.                 smsClass.InputMode = MSCommLib.InputModeConstants.comInputModeBinary;

  14.  

  15.                 if (smsClass.PortOpen == false)

  16.                 {

  17.                     try

  18.                     {

  19.                         smsClass.PortOpen = true;

  20.                     }

  21.                     catch (Exception ex)

  22.                     {

  23.                     }

  24.                 }

  25.  

  26.                 _sCommState = 1;

  27.             }

  28.             catch(Exception ex)

  29.             {

  30.                 StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt", true, System.Text.Encoding.Unicode);

  31.                 sw.WriteLine("InitComm" + System.DateTime.Now.ToString());

  32.                 sw.WriteLine("error:" + ex.Message);

  33.                 sw.Close();

  34.             }

  35.         }

     

     

    发送短信

 

  1. ///<summary>

  2.         ///发送短信

  3.         ///</summary>

  4.         ///<param name="sPhone">手机号</param>

  5.         ///<param name="sContent">发送内容</param>

  6.         ///<param name="sMessage">返回信息</param>

  7.         ///<returns>发送成功返回1,失败返回0</returns>

  8.         public static int SendSmsMessage(string sPhone, string sContent, string sMailName, string sModule, out string sMessage)

  9.         {

  10.             sMessage = "";

  11.             try

  12.             {

  13.                 SmsSetting.InitComm();

  14.  

  15.                 try

  16.                 {

  17.                     Byte[] btPhone = Encoding.ASCII.GetBytes(sPhone);

  18.                     Byte[] btContent = Encoding.Unicode.GetBytes(sContent);

  19.                     int nCount = btPhone.Length + btContent.Length + 2;

  20.                     Byte[] btSend = new Byte[nCount];

  21.                     btSend[0] = 0xAA;

  22.                     btSend[1] = 0x01;

  23.  

  24.                     int i = 0;

  25.                     for (i = 0; i < btPhone.Length; i++)

  26.                     {

  27.                         btSend[i + 2] = btPhone[i];

  28.                     }

  29.  

  30.                     for (int j = 0; j < btContent.Length; j = j + 2)

  31.                     {

  32.                         btSend[i + 2 + j] = btContent[j + 1];

  33.                         btSend[i + 2 + j + 1] = btContent[j];

  34.                     }

  35.  

  36.                     smsClass.Output = btSend;

  37.                     

  38.                     StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt", true, System.Text.Encoding.Unicode);

  39.                     sw.WriteLine("sendtime:" + System.DateTime.Now.ToString());

  40.                     sw.WriteLine("sPhone" + sPhone);

  41.                     sw.WriteLine("sContent:" + sContent);

  42.                     sw.Close();

  43.                 }

  44.                 catch (Exception ex)

  45.                 {

  46.                     sMessage = ex.ToString();

  47.                     StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt", true, System.Text.Encoding.Unicode);

  48.                     sw.WriteLine("SendSmsMessage" + System.DateTime.Now.ToString());

  49.                     sw.WriteLine("error:" + sMessage);

  50.                     sw.Close();

  51.                     return 0;

  52.                 }

  53.                 return 1;

  54.             }

  55.             catch (Exception ex)

  56.             {

  57.                 sMessage = ex.ToString();

  58.                 return 0;

  59.             }

  60.         }

 

 

 

OnComm事件函数

 

  1. ///<summary>

  2.         /// OnComm回调函数

  3.         ///</summary>

  4.         private static void smsClass_OnComm()

  5.         {

  6.             //结束串口串号的数据,接收到数据

  7.             if (smsClass.CommEvent == (short)(MSCommLib.OnCommConstants.comEvReceive))

  8.             {

  9.                 Thread.Sleep(500);

  10.                 smsClass.InputLen = 0;

  11.                 byte[] byReceive = (byte[])smsClass.Input;

  12.  

  13.                 byte[] by2 = new byte[9] { 0xAA, 0x01, 0x53, 0x65, 0x6E, 0x64, 0x20, 0x4F, 0x4B };//成功返回标记

  14.  

  15.                 if (ByteEquals(byReceive, by2))

  16.                 {

  17.                     //发送成功,发送下一条信息

  18.                     SmsSetting.g_JSmsList.RemoveAt(0);

  19.                     SmsSetting.OnStartSms();

  20.                 }

  21.                 else

  22.                 {

  23.                     SmsSetting.OnStartSms();

  24.                 }

  25.             }

  26.         }

     

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics