2016-12-07 14 views
1

すべてで、私たちはibuttonを読むためのibuttonデバイスを持っています。このデバイスはusbであり、FTDI仮想コンポートを持っています。レビューwince 6.0

私たちは読者からのデータを読むために私たちの簡単なアプリケーションを持っていますが、読者は問題を抱えています(読者の方がスワイプするとデータを送信しません) この場合G停止して起動する)、comportを再起動する - しかし、再起動後には、アプリケーションの複製はCPUの100%を消費する。

ここには、私たちが何をする必要があるか、あるいはソースコードを変更する方法があります。 ありがとうございます

using System; 
using System.IO; 
using System.Linq; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 
using OpenNETCF; 

namespace SerialDownload 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      AddLog("Vytvaram novy seriovy port"); 

      serialPort1 = new System.IO.Ports.SerialPort(); 
      serialPort1.PortName = "COM4"; 
      serialPort1.Handshake = System.IO.Ports.Handshake.None; 
      serialPort1.DataReceived += serialPort1_DataReceived; 
      //serialPort1.ErrorReceived += new System.IO.Ports.SerialErrorReceivedEventHandler(serialPort1_ErrorReceived); 
      //serialPort1.PinChanged += new System.IO.Ports.SerialPinChangedEventHandler(serialPort1_PinChanged); 
      serialPort1.WriteBufferSize = 10000; 
      serialPort1.RtsEnable = true; 
      serialPort1.DtrEnable = true; 
      serialPort1.ReadTimeout = 2000; 
      serialPort1.WriteTimeout = 2000; 
      AddLog("Vytvoreny seriovy port"); 
     } 
     bool zelena = false; 
     private void timerResetCOM_Tick(object sender, EventArgs e) 
     { 

      timerResetCOM.Enabled = false; 

      if (!nacitavam_kartu_serial) 
      { 
       try 
       { 

        string znak = "G"; 
        if (!zelena) 
        { 
         znak = "g"; 
         zelena = true; 
        } 
        else 
        { 
         zelena = false; 
        } 

        AddLog("Posielam " + znak); 
        serialPort1.WriteTimeout = 2000; 
        serialPort1.Write(znak); 
        System.Threading.Thread.Sleep(200); 
        AddLog("Odoslane " + znak); 

       } 
       catch 
       { 
        System.Threading.Thread.Sleep(200); 
        AddLog("Chyba serioveho portu pri odoslani G"); 
        try 
        { 
         serialPort1.DataReceived -= serialPort1_DataReceived; 
         AddLog("robim discard"); 
         serialPort1.DiscardOutBuffer(); 
         System.Threading.Thread.Sleep(200); 
         AddLog("Discard dokonceny"); 
         AddLog("Zatvaram port"); 
         serialPort1.Close(); 
         AddLog("port zatvoreny"); 

         KillProc("SerialDownload"); 
        } 
        catch 
        { 
         System.Threading.Thread.Sleep(200); 
         AddLog("Chyba zatorenia portu"); 

        } 

        /* 
        try 
        { 

         AddLog("Dispose serioveho"); 
         serialPort1.DataReceived -= serialPort1_DataReceived; 


         serialPort1.Dispose(); 
         System.Threading.Thread.Sleep(200); 

         AddLog("Dispose serioveho OK"); 

         AddLog("Vytvaram novy seriovy port"); 

         serialPort1 = new System.IO.Ports.SerialPort(); 
         serialPort1.PortName = "COM4"; 
         serialPort1.Handshake = System.IO.Ports.Handshake.None; 
         serialPort1.DataReceived += serialPort1_DataReceived; 
         //serialPort1.ErrorReceived += new System.IO.Ports.SerialErrorReceivedEventHandler(serialPort1_ErrorReceived); 
         //serialPort1.PinChanged += new System.IO.Ports.SerialPinChangedEventHandler(serialPort1_PinChanged); 
         serialPort1.WriteBufferSize = 10000; 
         serialPort1.RtsEnable = true; 
         serialPort1.DtrEnable = true; 
         serialPort1.ReadTimeout = 2000; 
         serialPort1.WriteTimeout = 2000; 
         AddLog("Vytvoreny seriovy port"); 

        } 
        catch (Exception ex) 
        { 
         AddLog("Chyba vytvaranie serioveho portu - alebo rusenia"); 
        } 
        System.Threading.Thread.Sleep(1000); 
        try 
        { 
         AddLog("otvaram port"); 
         serialPort1.Open(); 

         serialPort1.RtsEnable = true; 
         serialPort1.DtrEnable = true; 
         serialPort1.ReadTimeout = 2000; 
         serialPort1.WriteTimeout = 2000; 
         AddLog("port otvoreny"); 
        } 
        catch 
        { 
         System.Threading.Thread.Sleep(200); 
         AddLog("Chyba otvorenia portu"); 
        }*/ 
       } 
      } 

     } 
     bool nacitavam_kartu_serial = false; 

     private void KillProc(string name) 
     { 
      var processes = OpenNETCF.ToolHelp.ProcessEntry.GetProcesses(); 

      foreach (OpenNETCF.ToolHelp.ProcessEntry process in processes) 
      { 
       if (name == process.ExeFile) 
       { 
        process.Kill(); 
       } 
      } 
     } 

     private void AddLog(string riadok) 
     { 
      Debug.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:mm:ss") + ": " + riadok); 
     } 

     private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 

      nacitavam_kartu_serial = true; 
      AddLog("Nacitacam data"); 
      try 
      { 
       string pStrTmp = string.Empty; 
       while (serialPort1.BytesToRead > 0) 
       { 
        pStrTmp += (char)serialPort1.ReadByte(); 
        System.Threading.Thread.Sleep(15); 
       } 


       string card_id_t = pStrTmp; 

       AddLog("Nacitane data: " + card_id_t); 

       StreamWriter subor = File.CreateText("\\NAND\\karta_serial.txt"); 
       subor.Write(card_id_t); 
       subor.Close(); 
      } 
      catch (Exception ex) 
      { 
       AddLog(ex.Message); 
      } 
      nacitavam_kartu_serial = false; 
     } 
    } 
} 
+0

に役立ちます願っています。それは 'serialPort1.DataReceived + =新しいSystem.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived)'ではないでしょうか? – AlainD

+0

もう一つのコメントは 'ReadByte'と' Sleep'コマンドについてです。おそらく、通信チャネルがデータで詰まっている可能性があります。私はスリープを削除してデバッグするか、 'ReadLine'を使います(これはWindows CE 6.0アプリケーションでRS232ポートを使う方法です)。 – AlainD

答えて

0

私はここで答えを残します。 2年前、.NET Compact FrameworkとCOMポートで同様の問題が発生しました。私が持っていたデバイスはWindows Mobile 6に搭載されていましたが、他のデバイスはBTプリンタでした。

他のハンドヘルドデバイスもうまくいきました。プリンタの電源を入れたときに、まったく同じ問題が発生しました。アプリが遅くなり、もはや仕事に使用できなくなりました。

私の一時的な解決策は、SerialPortオブジェクトを閉じることでした。 `;

は、私はそれはあなたが` serialPort1.DataReceived + = serialPort1_DataReceived持っている理由私は好奇心が強い

関連する問題