2016-03-29 5 views
0

私は組み込みドメインからのもので、デバイス用のGUIを作成する必要があります。私はCでデバイスのファームウェアを書いて、Visual C#Windowsフォームアプリケーションを使ってGUIアプリケーションを作っています。デバイスが100msでシリアルポートにデータを送信していますが、winformsでデータを受信しようとしています。私はそれを受信するためのC#コードを以下の書かれているシリアルデータを受信中にWindowsフォームアプリケーションがハングアップする

10Q20Q30Q40Q50Q60Q70Q80Q90Q100Q110Q120Q130Q140Q150Q 

データ。

public Form1() 
{ 
    InitializeComponent(); 

    //Using data receive event handler to receive data    
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); 
} 

はその後comPort_DataReceivedに私は最終的に私は、データを読み取り、String dataにそれを保存しています

void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 

    Read(); 

} 

delegate void Callbackmessage(); 
void Read() 
{ 
    if (this.InvokeRequired) 
    { 
     Callbackmessage abc = new Callbackmessage(Read); 
     this.Invoke(abc); 
    } 
    else 
    { 
    String data = serialPort1.ReadLine(); 

    } 

)(Readを呼び出しています。アプリケーションは正常に動作していますが、ボタンが1秒後に応答しているようにハングしています。私がこの行String data = serialPort1.ReadLine();にコメントすると、アプリケーションはスムーズに動作します。アプリケーションがぶら下がっている理由私はシリアルポートからデータを受信する他の方法を知らない。助けてください。ありがとう。

+1

メインUIスレッドでI/O操作を行っているので、時間がかかります。タスクでこの操作を行うことを検討してください(https://msdn.microsoft.com/en-gb/library/system.threading.tasks.task(v=vs.110).aspx) – auburg

+0

@auburgありがとう私は間違いありませんこれを試して。実際に私はちょうどVisual C#を学び始めたので、私は学ぶことができるようにリソースを探しています – user007

答えて

0

一般的な提案は非同期を使用することですクライアントにそれを報告することができますIOおよびport.BaseStream.BeginRead。シリアルポートの周りにはいくつかの非同期ラッパーがあります。たとえば、これはoneです。 Hereも非同期使用のサンプルです。

関連する問題