查看: 6603|回复: 2
打印 上一主题 下一主题

c# 短信多卡设备开发移动空充平台

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-9 09:29:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的.net 的SerialPort 发送AT指令开发的!刚开始,发送一个线程,接受一个线程
因为都是用的同一个类中的同一个方法发送的AT指令
所以,有时候会提示,线程退出
  1. 其它信息:System.IO.IOException: 由于线程退出或应用程序请求,已中止 I/O 操作。

  2.    在 ModemProcess.Common.GSMModem.SendAT(String ATCom) 位置 f:\短信猫\ModemSingleProcess\ModemProcess\Common\GSMMODEM.cs:行号 364
  3.    在 ModemProcess.Common.GSMModem.DelReadAllMsg() 位置 f:\短信猫\ModemSingleProcess\ModemProcess\Common\GSMMODEM.cs:行号 548
  4.    在 ModemProcess.ModemConsoleForm1.gsm_OnRecieved(Object sender, EventArgs e) 位置 f:\短信猫\ModemSingleProcess\ModemProcess\ModemConsoleForm1.cs:行号 415
复制代码

在SendAT中加了lock也不管用、不知道什么原因。。。

还有就是有3个短信收发设备,一个新的好用,端口什么时候都能打开正常,发送正常
但是旧的一个猫池总是打开失败,或者发送超时
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
沙发
 楼主| 发表于 2015-1-9 09:32:38 | 只看该作者
  1. /// <summary>
  2.         /// 扫描订单集合启动发送短信委托
  3.         /// </summary>
  4.         public void GsmStartSendMessage(object o)
  5.         {
  6.             try
  7.             {
  8.                 SmartThreadPool stp = new SmartThreadPool();//这里演示了线程的分组
  9.                 //创建一个分组并用这个分组管理
  10.                 //如果需要设置这个分组为调用start的时候才开始运行,需要传入WIGStartInfo参数,将其参数中的StartSuspended设置为true然后调用分组的start方法
  11.                 IWorkItemsGroup mainGroup = stp.CreateWorkItemsGroup(30);
  12.                 mainGroup.OnIdle += mainGroup_OnIdle;
  13.                 while (true)
  14.                 {
  15.                     _areSendMsg.WaitOne();
  16.                     Thread.Sleep(1000);
  17.                     //扫描订单集合
  18.                     foreach (var keyValuePair in sendQueue)
  19.                     {
  20.                         KeyValuePair<GSMMONDEMABS, ConcurrentQueue<SMSServerModel>> pair = keyValuePair;
  21.                         if (pair.Value.Count == 0)
  22.                         {
  23.                             continue;
  24.                         }
  25.                         if (pair.Key.IsTakeUp)
  26.                             mainGroup.QueueWorkItem(new WorkItemCallback(ExecuteGsmSendMessage), pair);
  27.                         //ExecuteGsmSendMessage(pair);
  28.                     }
  29.                     //分组等待所有任务完成
  30.                     mainGroup.WaitForIdle();
  31.                 }
  32.             }
  33.             catch (Exception ex)
  34.             {
  35.                 _log.Error(ex);
  36.                 DelegateValue("GsmStartSendMessage" + ex.Message);
  37.             }
  38.         }
复制代码

  1. /// <summary>
  2.         /// 发送短信委托
  3.         /// </summary>
  4.         /// <param name="queue"></param>
  5.         /// <param name="gsm"></param>
  6.         public object ExecuteGsmSendMessage(object o)
  7.         {
  8.             ConcurrentQueue<SMSServerModel> queue = ((KeyValuePair<GSMMONDEMABS, ConcurrentQueue<SMSServerModel>>)o).Value;
  9.             GSMMONDEMABS gsm = ((KeyValuePair<GSMMONDEMABS, ConcurrentQueue<SMSServerModel>>)o).Key;
  10.             try
  11.             {
  12.                 ConcurrentQueue<SMSServerModel> tempQueue = queue;
  13.                 while (tempQueue.Count > 0)
  14.                 {
  15.                     Thread.Sleep(4000);
  16.                     string comName = string.Empty;
  17.                     string phone = string.Empty;
  18.                     try
  19.                     {
  20.                         SMSServerModel obj = null;
  21.                         if (tempQueue.TryDequeue(out obj))
  22.                         {
  23.                             if (!gsm.IsTakeUp)
  24.                             {
  25.                                 continue;
  26.                             }
  27.                             if (!gsm.IsOpen)
  28.                             {
  29.                                 gsm.Open();
  30.                             }
  31.                             comName = gsm.ComPort;
  32.                             obj.COMNO = gsm.ComPort;
  33.                             phone = obj.PREPAID_PHONE_NO;
  34.                             var msgText = gsm.ComModel.Pwd + "," + obj.PREPAID_PHONE_NO + "," + obj.MONEY;
  35.                             //充值短信格式:密码,手机号,金额
  36.                             gsm.SendMsg("10086500", msgText);
  37.                             bool bl = Bll.SendMsgUpdateByOrder(DateTime.Now.ToString(), "1", msgText, obj.ORDERNO,
  38.                                 gsm.ComModel.PhoneNumber, obj.COMNO);
  39.                             alreadySendList.Add(obj);
  40.                             DelegateValue(obj.COMNO + ": " + msgText + " (" + obj.BELONGINGTO + ")发送成功,ThreadId:" +
  41.                                 Thread.CurrentThread.ManagedThreadId + " (更新数据" + (bl ? "成功)" : "失败)"));
  42.                             this.Invoke(new Action(delegate
  43.                             {
  44.                                 this.lblsum.Text = "当前订单数:" + sendQueue.Sum(q => q.Value.Count);
  45.                             }));
  46.                         }
  47.                     }
  48.                     catch (Exception ex)
  49.                     {
  50.                         DelegateValue(comName + "  发送短信异常:" + phone + ex);
  51.                     }
  52.                     finally
  53.                     {
  54.                         //if (!sendQueue.Any(q => q.Value.Count > 0))
  55.                         //{
  56.                         //    _areReaddb.Set(); //通知读取数据库
  57.                         //    _areSendMsg.Reset(); //停止发送短信线程
  58.                         //}
  59.                     }
  60.                 }
  61.             }
  62.             catch (Exception ex)
  63.             {
  64.                 DelegateValue("ExecuteGsmSendMessage" + ex);
  65.                 _log.Error(ex);
  66.             }
  67.             return 0;
  68.         }
复制代码

  1. void mainGroup_OnIdle(IWorkItemsGroup workItemsGroup)
  2.         {
  3.             if (!sendQueue.Any(q => q.Value.Count > 0))
  4.             {
  5.                 _areReaddb.Set(); //通知读取数据库
  6.                 _areSendMsg.Reset(); //停止发送短信线程
  7.             }
  8.         }
复制代码


还有怎么优化,可以支持多线程发送。一个端口起一个线程,并行发送
板凳
发表于 2015-1-9 17:25:30 | 只看该作者
对于你的开发问题我就不懂了,然后你上面说3个猫,新的可以久的不行,你要先确定下两个猫使用的波特率是否都相同,还有看看两个猫获取得到的信号是否都一样,先用超级终端来测试清楚再进行连接测试。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-5-1 11:45 , Processed in 0.073713 second(s), 29 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)