2017-02-20 17 views
1

でサーバー側のシリアルポートからデータを送受信する方法サーバー側のシリアルポートからコマンドを送受信するasp.net mvc 5でプログラムを開発しようとしています。実際には、サーバーに接続されたハードウェアがあり、このハードウェアにコマンドを送信し、その応答を取得したいと考えています。asp.net mvc

これは、私がデータを送信するために使用する方法である:

public static void SendData(string data) 
{ 
    SerialPort port = new SerialPort(
    "COM5", 9600, Parity.None, 8, StopBits.One); 


    port.Open(); 


    port.Write(data); 




    port.Close(); 
} 

、これが私の方法で受信です:

public static void ReceiveData() 
    { 
     if (port != null && port.IsOpen) 
      port.Close(); 
     port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 


     port.Open(); 


    } 
    public static void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     int dataLength = port.BytesToRead; 
     byte[] data = new byte[dataLength]; 
     int nbrDataRead = port.Read(data, 0, dataLength); 
     if (nbrDataRead == 0) 
      return; 


     Taxi.Controllers.ReceiveController.Decision(System.Text.Encoding.UTF8.GetString(data)); 

    } 

私は私の受信方法に問題があるし。ハードウェアが文字列を送信するたびに、インデックスビューで最後の文字が表示されます。 投稿された文字列のすべての文字を受け取る受信メソッドをどのように作成できるのでしょうか。

+0

は、あなたが他の人がより良いあなたの質問に答えるために、これまでにしようとしているコードを入力してください。 –

+0

私はそう思います...私は答えにとても近いです。私はこの記事で取り組んでいます。https://web.archive.org/web/20130709121945/http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_- in-C_2300 _-。NET.aspx –

+0

今日の私の答えはあまりにも厳しいです。 – Snoopy

答えて

0

最後に私の答えが見つかりました。 これは、シリアルポートの送信速度の干渉とサーバの速度を受信(計算)することについてです! あなたが見るように、あなたが、「port_DataReceived」方法の1行目にスリープ時間を設定する必要があります。

public static void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 

     Thread.Sleep(TimeSpan.FromMilliseconds(100)); 
     int dataLength = port.BytesToRead; 
     char[] result = new char[dataLength]; 

     for (int len = 0; len < result.Length;) 
     { 


      len += port.Read(result, len, result.Length - len); 
     } 
     string send = ""; 
     for (int i = 0; i < result.Length; i++) 
     { 
      send += result[i]; 
     } 

     Taxi.Controllers.ReceiveController.Decision(send); 

    }