DataReceivedイベントを使用できます。新しいデータがあなたのポートに到着するたびに解雇されます。あなたはこのようにそれを登録する必要があります。イベントハンドラで
SerialPort port = new SerialPort(/*your specification*/);
port.DataReceived += Port_DataReceived;
あなたがして、受信データを読み出します
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = sender as SerialPort;
if (port != null)
{
var incoming_message = port.ReadExisting();
}
}
今、あなただけのポートを開く必要があり、それが自動的に待機します。注意!入ってくるデータはメインスレッドとは異なるスレッドに到達します。
var incoming_message = port.ReadLine();
それともあなたは試みることができる:あなたが表示するために、フォームのコントロールを使用したいのであれば、あなたがReadLine
メソッドを使用して試みることができるあなたのデータは\n
で終わりにマークされている場合BeginInvoke
を使用する必要がありますReadTo
var incoming_message = port.ReadTo("\n");
EDIT:
このような長い時間がある場合は、バッチで読む必要があります。また、それをwhileループで処理しようとすることもできます。
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = sender as SerialPort;
string message = "";
if (port != null)
{
while(port.BytesToRead > 0)
{
message += port.ReadExisting();
System.Threading.Thread.Sleep(500); // give the device time to send data
}
}
}
EDIT 2:
あなたがデータを保存したい場合は、イベントハンドラのList<string>
外を宣言し、それが完全に読み込まれたときに文字列を追加します。
List<string> dataStorage = new List<string>();
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = sender as SerialPort;
string message = "";
if (port != null)
{
while(port.BytesToRead > 0)
{
message += port.ReadExisting();
System.Threading.Thread.Sleep(500); // give the device time to send data
}
// add now the entire read string to the list
dataStorage(message);
}
}
イベントハンドラを使用すると、1つのリスト内全体受信したメッセージを集めるだけでA
またはB
を送っているかどうかわからないので。あなたが任意のコードサンプルを持っていますかあなたは私たちを見ることができます
string [] A_array_data = dataStorage[0].Split(" ");
:あなたは、あなたのコマンドを送信していた順番なので、後であなたが対応するメッセージを取り出して、配列内の400個のエントリを取得するために
Split
を使用することができますを知っていますか? –新たにstackoverflowに追加しよう – oakar
フォームクローズイベントの中で、おそらくシリアルポートで 'Close()'を呼び出すこともできます。 'BackgroundWorker'を使用している場合、読み込み呼び出しのブロックを解除する必要がありますか? – nicholas