討論區快速選單
知識庫快速選單
討論區最近新進100則主題 程式設計俱樂部Facebook粉絲團 想要資料分析就學Python
[ 回上頁 ] [ 討論區發言規則 ]
關於serial port與委派問題
更改我的閱讀文章字型大小
作者 : love007002(爆走笨魚)
[ 貼文 35 | 人氣 1891 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/12/3 下午 09:27:52
小弟有個問題想請問各位, 我有三個不同的serial com, 各別發收不同命令與資料. 利用委派方式處理, 當我程式執行後, 就持續委派.
但我程式跑來會不定時軟體當機, 甚至開啟程式就馬上死當.
我想請求各位, 我的寫法是否哪裡有錯或者觀念錯誤, 因為我用try catch抓紀錄有只會抓到拒絕存取, 卻找不出原因.
以下是我的程式碼, 其餘兩個寫法一樣.

在COMPORT.dll檔內
private delegate Boolean MyStatusDelegate();
private static MyStatusDelegate oMyStatusDel;
private static event MyStatusDelegate oMyStatusDelList;
private static Object MyScanTHKObj = new Object();

public static Boolean Set_THK_Info_Timer()
{
     Boolean WriteResult = false;
     IAsyncResult result;

     oMyStatusDel += new MyStatusDelegate(THK_Info);

     oMyStatusDelList += oMyStatusDel;
     result = oMyStatusDelList.BeginInvoke(null, null);
    
     result.AsyncWaitHandle.WaitOne();

     WriteResult = oMyStatusDelList.EndInvoke(result);

     Delegate[] Dels = oMyStatusDelList.GetInvocationList();

     for (int i = 0; i < Dels.Length; i++)
     {
     oMyStatusDelList -= Dels[i] as MyStatusDelegate;
     }

     return WriteResult;

}

private static Boolean THK_Info()
{
    lock (MyScanTHKObj)
    {
     Boolean THKTranfResult = false;

     try
     {
     String Cmd = "C3-1";
     String Result = myclass.Send_To_Cmd(Cmd); //送com命令並接收

     if ((Result.IndexOf("STATUS") == -1) && (Result.IndexOf("RESET") == -1) && (Result.IndexOf("READY") == -1) && (Result.IndexOf("START") == -1) && (Result.IndexOf("ABORT") == -1))
     {
     return false;
     }

     ........ //處理接收資料

     THKTranfResult = true;

    
     }
     catch (Exception ex)
     {
     Communication_Log_Management_Editor.Communication_Log_Management_Editor.Log("THK_Info()" + ex.Message, System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
     }
     finally
     {
     }

     return THKTranfResult;
     }
}

private String Send_To_Cmd(String cmd)
{
     String Result = "";

     for (int i = 0; i < 3; i++)
     {
     Result = SendCmd(cmd);

     if ((Result != "") && (Result.IndexOf("NG") == -1))
     {
     break;
     }
     }

     if ((Result == "") || (Result.IndexOf("NG") != -1))
     {
     Log("Send CRTM Command: " + cmd + " & Result: " + Result, System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), 1);
     }

     return Result;
}

 private String SendCmd(String Cmd)
{
     String AnsString = "";
     try
     {
     if (!this.serialPort1.IsOpen)
     {
     this.serialPort1.Open();
     this.serialPort1.ReadTimeout = 5000;
     }
     string str = Cmd.Trim() + "\r";
     byte[] cmd = Encoding.Default.GetBytes(str);
     byte[] Buffer = null;
     this.serialPort1.Write(cmd, 0, cmd.Length);
     StringBuilder data = new StringBuilder();
     do
     {
     Thread.Sleep(100);
     if (serialPort1.BytesToRead > 0)
     {
     Buffer = new byte[serialPort1.BytesToRead];
     serialPort1.Read(Buffer, 0, Buffer.Length);
     for (int i = 0; i < Buffer.Length; i++)
     {
     data.Append(Buffer[i]);
     }

     }
     else
     {
     break;
     }
     } while (true);

     string AnsText = "";
     for (int j = 0; j < data.ToString().Length; j = j + 2)
     {
     AnsText = AnsText + Convert.ToString((char)Convert.ToInt32(data.ToString().Substring(j, 2)));
     }

     AnsString = AnsText;
     }
     catch (Exception e)
     {
     Log("CRTM SendCmd() Error:" + e.Message, System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

     }
     finally
     {
     if (this.serialPort1.IsOpen)
     {
     this.serialPort1.Dispose();
     this.serialPort1.Close();
     Thread.Sleep(200);
     }
     }
     return AnsString;
 }

主程式

private static System.Threading.Timer CRTMTimer;

private static void CRTM_CallBack(object sender)
{
   COMPORT.Set_THK_Info_Timer(); //呼叫COMPORT.DLL的委派

}

private void Monitor_Load(object sender, EventArgs e)
{
   CRTMTimer = new System.Threading.Timer(new TimerCallback(CRTM_CallBack), null, 1000, 1500);
}
 板主 : 小朱
 > C# - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C# - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C#
1 小朱 6270 
2 蹂躪 2700 
3 HKLN.net 2440 
4 marlon 2130 
5 joe 1320 
6 識丁 910 
7 好說 860 
8 愛睏魚 770 
9 總幹事 720 
10 Demonbane 600 
C#
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875