2016-11-11 11 views
-1

Windowsのタスクスケジューラでスケジュールされたコンソールアプリケーションを構築して、設定した時間に毎日コードを実行します。要約すると、このアプリケーションはSerialPortによって読み書きされます。アルドゥイーノに何かを送るとき、私が送ったものを完成させてコマンドを実行するために、何かを受け取る必要があります。C#のシリアルポートとの間でデータを読み書きする

言い換えれば、私はドアが開いているかどうかを確認するために何かを送信します。アプリケーションがそれを閉じるコードを実行する場合は、参照してください。ドアがすでに閉じている場合は、Arduino Led Displayに表示するキャラクターの束を送信します。

私はコードを開発しましたが、可能であれば、それが完全に正しいかどうかはわかりません。私が作ることができる変更がありますか?

static void Main(string[] args) 
{ 
    SerialPort comport = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); 
    comport.Open(); 

    string start = "?"; 
    string carriageReturn = "\r"; 
    string text = string.Empty; 

    string mensage = "@" + "r" + "\r"; 
    string mensage2 = "@" + "{" + texto + "\r"; 

    try 
     { 
      while (true) 
      { 
       //Send to the Arduino 
       comport.Write(start+ "*" + carriageReturn); 

       //If the serial port have bytes to read 
       if (comport.BytesToRead > 0) 
       { 
        //Buffer with data 
        byte[] dados = HexStringToByteArray(mensage); 

        //Handle data 
        comport.Read(dados, 0, dados.Length); 

        //Send again to execute the the command 
        comport.Write(start + "*" + carriageReturn); 
       } 

       if (comport.BytesToRead > 0) 
       { 
        comport.Write(start + "*" + carriageReturn); 

        byte[] dados2 = HexStringToByteArray(mensage2); 

        comport.Read(dados2, 0, dados2.Length); 

        comport.Write(text); 
       } 
       comport.Close(); 
      } 
     } 

     catch(Exception ex) 
     { 
     } 
} 

private static byte[] HexStringToByteArray(string s) 
{ 
    s = s.Replace(" ", ""); 
    byte[] buffer = new byte[s.Length/2]; 

    for (int i = 0; i < s.Length; i += 2) 
     buffer[i/2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); 
     return buffer; 
} 

EDIT:

私の基本的な入出力マッピング/関係は以下のとおりです。

私は、私は答えを待っています、アルドゥイーノに?*\rを送信します。

Arduinoの回答が@r\rの場合は、?*\rを再度送信します。

Arduinoからの回答が@{/rの場合、私は彼に文字列を送信します。

+2

これは、StackOverflowのトピックではありません。コードレビューを取得するには、[codereview.stackexchange.com](http://codereview.stackexchange.com/)に質問を投稿してください。 – dymanoid

+0

既にコメントが更新されています....英語で。これはポルトガル語のbtw @MongZhu – Forrobodo

+0

なぜ 'byte []'を埋めて、それを 'SerialPort'から読み込んだ値で上書きするのですか? –

答えて

0

私の改訂の最初の試みです。

イベントDataReceivedを使用して、出口戦略を検討する必要があります。今まであなたのプログラムは終了しませんでした。

static void Main(string[] args) 
{ 
    SerialPort port = new SerialPort("COM1", 9600, Parity.Odd, 7, StopBits.One); 
    // register the event 
    port.DataReceived += Port_DataReceived; 
    //open the port 
    port.Open(); 

    try 
    { 
     // start the communication 
     port.Write("?*\r"); 

     Console.WriteLine("Waiting for response"); 

     // Your manual exit strategy. Hit a kKeyboard-key to end this game 
     while (!Console.KeyAvailable) 
     { 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Writing failed! \nError: " + ex.Message); 
    }   
} 

DataReceivedイベントは、すぐArduinoのはあなたに何かを送信して起動されます。それができない場合は、プログラムを手動で終了することができます。

イベントの中でロジック全体を実行できます。あなたはすでに入出力マッピングを投稿しているので、あなたの投稿に書かれているように、ソリッドコードにハックすることができます。私は右、(ドアがアルドゥイーノによって行われる開閉適切にあなたの説明を理解していれば

private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort port = sender as SerialPort; 

    // read input 
    string incoming = port.ReadExisting(); 

    switch (incoming) 
    { 
     case "@r\r": 
      // send the message back 
      port.Write("?*\r"); 
      break; 
     case @"@{/r": 
      port.Write("Display this!"); 
      break; 
     default: 
      Console.WriteLine("Unknown command from Arduino!\n Command: " + incoming); 
      break; 
    } 
} 

私はそれが

+0

私はあなたのコードを勉強し、あなたに私が得たものをフィードバックしますか? – Forrobodo

+0

あなたのコードは気に入っていますが、このコードはタスクスケジューラから呼び出されたときに自動的に実行され、キーボードから手動でキーをクリックする人はいません。ええと? – Forrobodo

+0

あなたはまだプログラムを終了する方法を考えるべきです。それは永遠に続くでしょう。それはあなた次第です。私はあなたが私のコードを好きだとうれしいです、それがあなたを助けたなら、それを答えにすると考えるかもしれません。 :) –

0

に役立ちます願っています:それは唯一の2例である場合は、スイッチ/ケース構造体を使用することができますか?)、これは、タスクです:

コンソールアプリケーションスケジュールされたタスクのステータスをチェックし、ステータスがthatsの必要告げる場合
  • Arduinoのステータスをバック報告(および最終的にはそのタスクがあった)(何かを実行するために、シリアル経由のArduinoをトリガー
    • 行って)

    あなたは、それは非常に単純行うことができます:

    "?" --> PC sends a trigger: Check door status and behave accordingly 
    

    その後PCが応答を待つ:

    "1" <-- Arduino response (door was already closed) 
    "2" <-- or alternate response (I closed the door) 
    

    Arduinoはエラーを示すために何かを送ることができました。 (十分に発明して自由に感じてください)

    さらに、アルデューノは全く反応しない可能性があります。だからあなたのスケジュールされたコンソールアプリはどうしますか?

    Arduinoとあなたの小さなシリアルPCコードの方がシンプルになるように、1バイト以上を送受信する必要はありません。

    PCコードにはユーザーインターフェイスがないため、ドアを閉じるにはしばらく時間がかかりますが、Arduinoはすぐに応答する必要はありません。

  • +0

    基本的に私は "?* \ r"を一緒に送信していますが、Arduinoはこのコマンドが尋ねることを知っていますドアが開いている場合は "@ r \ r"を読んで "?* \ r"を送信して閉じます。ドアの状態が既に閉じている場合は別のものを送信します。私はどういう意味ですか? – Forrobodo

    +0

    arduinoには "?* \ r"の意味はありますか?ドアの状態に反応する質問それともコマンドですか?なぜあなたはそれが複雑すぎると思いますか? – datafiddler

    +0

    No.私に連絡してください – Forrobodo

    関連する問題