定义 ModemManager 调度管理类


ModemManager 类用于对所有 Modem 对象进行管理和调度使用。ModemManager 类代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Threading;namespace RequestResponse001CS
{// 拨号器管理者public class ModemManager{//已经安装了拨号器的串口对象private List<Modem> modemCollection = null;// ModemCollection 的调度编号private int modemNumber = -1;//当前有无可使用的串口拨号器private bool hasEnabled = false;//串口拨号器的重新检测间隔分钟private int reCheckMinutes = 30; //默认30分钟//波特率配置列表private Dictionary<string, int> boudrateCollection = null;//获得当前时间private DateTime checkDateTime = DateTime.Now;private ManagerCallback m_callBack = null; //返回委托事件#region 委托public delegate void ManagerCallback(String message);//委托返回信息private void ReturnMessage(String message){if (message.Length > 0 && m_callBack != null){m_callBack(message);}}#endregion#region 属性public List<Modem> ModemCollection{get { return modemCollection; }}//可使用的拨号器个数public int EnabledCount{get{if (modemCollection == null) return 0;else return modemCollection.Count;}}public bool HasEnabled{get { return hasEnabled; }//set { hasPort = value; }}//波特率配置列表public Dictionary<string, int> BoudrateCollection{get { return boudrateCollection; }set { boudrateCollection = value; }}//串口拨号器的重新检测间隔分钟public int ReCheckMinutes{get { return reCheckMinutes; }set { reCheckMinutes = value; }}#endregion#region  构造方法public ModemManager(ManagerCallback callBack) {if (callBack != null) m_callBack = callBack;}public ModemManager(int reCheckMinutes, ManagerCallback callBack){this.ReCheckMinutes = reCheckMinutes;if (callBack != null) m_callBack = callBack;}public ModemManager(Dictionary<string, int> boudrateCollection, ManagerCallback callBack){this.BoudrateCollection = boudrateCollection;if (callBack != null) m_callBack = callBack;}public ModemManager(Dictionary<string, int> boudrateCollection, int reCheckMinutes,ManagerCallback callBack){this.BoudrateCollection = boudrateCollection;this.ReCheckMinutes = reCheckMinutes;if (callBack != null) m_callBack = callBack;}#endregion  构造方法#region  调度方法/// <summary>/// 调用拨号器/// </summary>/// <param name="cardNumber"></param>public void ModemInvoking(string cardNumber){if (hasEnabled == false){// 获得串口上已经安装了拨号器的对象this.GetModemCollection();}if (hasEnabled == true){this.ModemCalling(cardNumber);}//定期检测串口列表if (checkDateTime.AddMinutes(ReCheckMinutes) <= DateTime.Now){// 重新获得串口上已经安装了拨号器的对象this.GetModemCollection();checkDateTime = DateTime.Now;}}/// <summary>/// 获得串口上安装了拨号器的对象/// </summary>public void GetModemCollection(){if (modemCollection == null){modemCollection = new List<Modem>();}int modemCollectionCount = modemCollection.Count;//步骤一: 重新获得所有的串口名称(列表)string[] portNames = SerialPort.GetPortNames();//如果当前串口数目 > 正在使用的COMif (portNames.Length > modemCollectionCount){ReturnMessage("正在检测可以使用的拨号器..."); //测试使用foreach (string portName in portNames){//当前串口名是否存在拨号列表中bool existModem = false;if (modemCollectionCount > 0){existModem = modemCollection.Exists(delegate(Modem myModem){return portName == myModem.PortName;});}//如果当前串口名不存在拨号列表中,则重新检测!if (!existModem){ReturnMessage("正在检测:" + portName); //测试使用AddModemToCollection(portName);}}}// 判断当前计算机有无可使用串口端hasEnabled = modemCollection.Count <= 0 ? false : true;}/// <summary>/// 对拨号器的调度使用/// </summary>private void ModemCalling(string cardNumber){if (modemCollection == null) return;// 等待线程进入 Monitor.Enter(modemCollection);Modem modem = null;try{//获得当前调用的串口对象的索引号int number = GetModemNumber();if (number >= 0) //判断是否存在拨号器{modem = modemCollection[number];if (modem != null) // && !modem.IsWorking){ReturnMessage(string.Format("{0} 正在对 SIM卡:{1} 进行拨号...", modem.PortName,cardNumber)); modem.DialingNumberToModem(cardNumber); //对 SIM 进行拨号,唤醒上位机}}else{ReturnMessage("没有可使用的拨号器,重新对端口进行检测...");this.GetModemCollection();}}catch{//再一次检查该 COM 能否使用! (范工提议)if (modem != null){string portName = modem.PortName;modemCollection.Remove(modem); //从可用列表去除modem.CloseModem();AddModemToCollection(portName);}}finally{if (modemCollection != null){// 通知其它对象Monitor.Pulse(modemCollection);// 释放对象锁 Monitor.Exit(modemCollection);}}}/// <summary>/// 获得对 ModemCollection 的调度编号/// </summary>/// <returns></returns>private int GetModemNumber(){lock (this){if (modemNumber + 1 >= modemCollection.Count){if (modemCollection.Count == 0) modemNumber = -1;else modemNumber = 0;}else{modemNumber++;}return modemNumber;}}/// <summary>/// 添加 Modem 到 modemCollection/// </summary>private void AddModemToCollection(string portName){Modem myModem = null;//是否设置波特率?if (boudrateCollection != null&& boudrateCollection.ContainsKey(portName)&& boudrateCollection[portName] != 0){myModem = new Modem(portName, boudrateCollection[portName], ReturnMessage);}else{myModem = new Modem(portName, ReturnMessage);}bool hasModem = myModem.CheckPortExistModem();if (hasModem){modemCollection.Add(myModem);}else{myModem.CloseModem();myModem = null;}}/// <summary>/// 释放所有的串口资源/// </summary>public void CloseModemCollection(){if (modemCollection != null){for (int i = 0; i < modemCollection.Count; i++){modemCollection[i].CloseModem();modemCollection[i] = null;}modemCollection = null;}if (boudrateCollection != null){boudrateCollection = null;}}#endregion}
}

定义 FormModemManager 测试界面类


测试界面 FormModemManager 类用于对 ModemManager 对象进行测试,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace RequestResponse001CS
{public partial class FormModemManager : Form{public FormModemManager(){InitializeComponent();}ModemManager ModemManager;Thread thread;private void FormModemManager_Load(object sender, EventArgs e){ModemManager = new ModemManager(5, TakeControl);}public void TakeControl(string message){if (this.InvokeRequired){Modem.SetCallback d = new Modem.SetCallback(TakeControl);this.Invoke(d, new object[] { message });}else{//MessageBox.Show(message);this.txtMessageShow.Text = this.txtMessageShow.Text + message + "\r\n" ;this.txtMessageShow.Select(this.txtMessageShow.Text.Length, 0);this.txtMessageShow.ScrollToCaret(); }}private void FormModemManager_FormClosing(object sender, FormClosingEventArgs e){if (thread != null){thread.Abort();}}private void Button_Run_Click(object sender, EventArgs e){thread = new Thread(new ThreadStart(Run));thread.Start();}private void Run(){try{// 获得串口上已经安装了拨号器的对象ModemManager.GetModemCollection();if (ModemManager.HasEnabled == false){TakeControl("当前计算机无可使用的串口拨号器!");}else{TakeControl("当前计算机可使用的拨号器如下:");List<Modem> modemCollection = ModemManager.ModemCollection;for (int i = 0; i < modemCollection.Count; i++){Modem modem = modemCollection[i];TakeControl(string.Format("端口名:{0},波特率:{1}",modem.PortName, modem.Boudrate.ToString()));}}while (ModemManager.HasEnabled){// 调用拨号器if (string.IsNullOrEmpty(txtCardNumber.Text.Trim())){ModemManager.ModemInvoking("135xxxxxxxx"); // SIM 卡号}else ModemManager.ModemInvoking(txtCardNumber.Text.Trim());Thread.Sleep(5000);}TakeControl("程序运行结束!");}finally{// 释放所有串口资源组件ModemManager.CloseModemCollection();}}//运行停止private void Button_Stop_Click(object sender, EventArgs e){if (ModemManager != null){ModemManager.CloseModemCollection();}}}
}

测试页面截图如下:

本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2013/05/13/3075992.html,如需转载请自行联系原作者

使用SerialPort 对象实现串口拨号器通信[下]相关推荐

  1. 使用C# 实现串口拨号器的SIM卡通信

    写此博客意为抛砖引玉,希望能和博客园的朋友们探讨一下关于.NET 在工业方面的应用,包括:物联网.无线通信.嵌入式开发.工业控制等等.欢迎探讨,多多指教!^_^ 下面是我在开发中,使用C#代码实现对安 ...

  2. 使用C# 实现串口拨号器的SIM卡通信[修正版]

    在第一版 使用C# 实现串口拨号器的SIM卡通信 的代码中,存在一些实际的问题,经过反复测试和实际使用,对原代码进行了一些改进. 首先,博客园的ㄟ荖樹炪厊ㄖ同学提出将拨号指令ATD发出后,不必使用 T ...

  3. 在C#中使用SerialPort类实现串口通信

    在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信等.本文章将本人在学习过程中从网络上搜集到的相关信息写出来供大家参考. 下面主要介绍该类的主要属性(表1) ...

  4. 在C#中使用SerialPort类实现串口通信 遇到多线程问题

    在C#中使用SerialPort类实现串口通信 遇到多线程问题 在C#中使用SerialPort类实现串口通信. 2009年11月01日 星期日 10:03 在.NET work 2.0中提供了Ser ...

  5. 基于C#的串口扫描枪通信实战

    今天搞大事,观众们动起来,搞事的目的是 掌握串口通信及winform开发技术 硬件设备:1.串口激光扫描枪,注意是串口,不是USB口 2.USB转串口的连接线一根,如图连接所示 3.USB扩展器一个, ...

  6. Android入门——电话拨号器和4种点击事件

    关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1.  ...

  7. Android 拨号器

    2019独角兽企业重金招聘Python工程师标准>>> 一.实现思路: 1.实现界面,界面上有EditText  控件, Button 控件 2.资源文件 values 下创建str ...

  8. android案例一 电话拨号器

    效果图: 电话拨号器的核心原理:  意图 MainActivity代码: private EditTest et_number; //加载一个布局 setContentView(R.layout.Ma ...

  9. Android-简单拨号器案例

    Android [19]简单电话拨号器 @方法步骤 1.新建一个android程序,项目名设置为 phone  ,然后打开  phone->res->layout->activity ...

最新文章

  1. windows 技巧篇-查看文件夹被那个进程占用,文件夹占用解除方法
  2. 看门狗寄存器c语言代码_「正点原子NANO STM32F103开发板资料连载」第十一章 看门狗实验...
  3. Fiori应用的花瓣动画效果是怎么画出来的
  4. JBoss BPM Suite 6.0.3版本的5个实用技巧
  5. BZOJ3110: [Zjoi2013]K大数查询(整体二分)
  6. c++ enum 给定类型_在 Rust 中创建 C/C++ API
  7. UML的类图中各箭头的含义
  8. 您现在可以在Windows 10上下载Amazon Alexa App
  9. ArcGIS中ERROR 999999报错Configuration RasterCommander ImageServer can not be started解决
  10. 杭州电子科技大学acm--2018
  11. 云上Java System Profiling与Debugging——蚂蚁金服观察与实践
  12. Codevs 3729==洛谷P1941 飞扬的小鸟
  13. 一个计算机网络由8台计算机组成,2016年真题824计算机组成原理+计算机网络(2016-B).doc...
  14. CentOS8搭建实现私有CA和证书申请
  15. IoT开发——WIFI模块ESP8266 RTOS SDK V3.0.0环境搭建
  16. BLE学习(4):蓝牙地址类型和设备的隐私
  17. 项目实训——2022
  18. (转)阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访
  19. 【Scratch-外观模块】漩涡特效指令
  20. Android开发规范:API接口安全设计规范

热门文章

  1. django 接收ajax请求
  2. rhel6.3-64 yum问题
  3. PBR在城域网上的应用
  4. ASP与數据庫,文本文件鏈接精髓
  5. 吐槽Javascript系列三:数组的陷阱
  6. 有关windows firewall边缘遍历(Edge traversal)的一点信息
  7. PCI的imagework已由freeview软件代替
  8. 长江浪漫水城2008年度营业时间和票价
  9. 协同过滤算法(天池竞赛试题)
  10. Uva 10061 进制问题