2016-08-17 11 views
2

私はST-Linkに接続されたプログラムを持っています。コンボボックスからファームウェアを選択することができる瞬間に、startを押すと、ST-LInkに接続された回路基板にファームウェアがプログラムされます。CLIからデータを読み取ることができません

これを行うには、CLIを使用してST-LINK_CLI.exeを使用してST-Linkにコマンドを送信します。ファームウェアがプログラムされると、コマンドプロンプトに「アプリケーションを実行して終了する」というメッセージが表示されます。ここでユーザーはenterを押し、アプリケーションはボード上で実行され、CLIは終了します。

しかし、私がする必要があるのは、ユーザーがEnterを押したときにプロンプ​​トを表示せず、自動的に行うことだけです。

これを行うための私の考えは、CLIからの出力を読んで、ユーザーにプロンプ​​トが表示されたときの出力を把握することでした。私はループを実行し、出力データを読み込み、ユーザーがEnterキーを押したときに出力データと一致すると、SendKeys.Send( "{ENTER}")を使用します。

ただし、データの読み込みに問題があります。動作していない、次 は「『System.InvalidOperationException』種類の未処理の例外がストリーム部の端にSystem.dllのとの点で発生しました:

 string STPath = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\ST-LINK Utility\ST-LINK_CLI.exe"; 
     string path2 = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\Firmware\PXL3-DELL-2B.SREC"; 

     Process p = new Process(); 
     p.StartInfo.FileName = STPath; 
     p.StartInfo.Arguments = "-ME -p " + firmwareLocation + " -v -Run "; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.CreateNoWindow = false; 

     p.Start(); 
     p.BeginOutputReadLine(); 
     p.WaitForExit(); 

     while (!p.StandardOutput.EndOfStream) 
     { 

      string line = p.StandardOutput.ReadLine(); 
      File.WriteAllText("New.txt", line); 

     } 

次はアップしますエラーメッセージです。

これが起こって?それともプロンプト問題の周りの別の方法がある場合にされた理由を誰もが知っていた場合、私は不思議でしたか?

おかげ ルーシー

答えて

0

がする最良の方法されていない可能性がこれを行うが、ユーザーがいなくてもそれを終了させて​​実行させるには、終了するまで入力キーをただちに送信した。

while (process.HasExited == false) 
       { 
        SendKeys.SendWait("{ENTER}"); 
       } 
+0

これはビジーループです:

は、私はあなたが必要なものは、このようなものを使用してコードを置き換えることであると思われますか?そうであれば、送信されるキーの量とCPU使用量を制限するために、「スリープ」コール(おそらく50ミリ秒)を追加することをお勧めします。 –

+0

それは良いアイデアです、ありがとう – lucycopp

1

CLIアプリケーションは、標準のIを使用している場合/ O、あなただけの入力ストリームに書き込むことができます。

p.StandardInput.WriteLine(); 

はまた、あなたはストリームをリダイレクトするとき、あなたそれらから読み取る必要があることに注意してください。あなたの場合は、1行だけを読んでから、プログラムが終了するのを待ちます。プログラムがバッファーに収まるより多くのテキストを出力すると、デッドロックが発生します。 p.WaitForExit()を取り除くだけで無意味で危険です。

1

p.BeginOutputReadLine()が非同期読み取りを開始するため、例外が発生しています。これは通常、outputdatareceivedイベントの処理で終了します。

ただし、asyncイベントが長時間実行されていて、非同期読み取りと互換性のないReadLine()への同期呼び出しが完了していない場合、このイベントは処理されません。

string STPath = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\ST-LINK Utility\ST-LINK_CLI.exe"; 
    string path2 = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\Firmware\PXL3-DELL-2B.SREC"; 

    using (Process p = new Process()) 
    { 
     p.StartInfo.FileName = STPath; 
     p.StartInfo.Arguments = "-ME -p " + firmwareLocation + " -v -Run "; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.CreateNoWindow = false; 

     p.Start(); 

     while (!p.StandardOutput.EndOfStream) 
     { 
      string line = p.StandardOutput.ReadLine(); 
      Console.WriteLine(line); 
      if (line == "run application to exit") 
      { 
       p.StandardInput.WriteLine(); 
      } 
     } 

     p.WaitForExit(); 
    } 
関連する問題