0

これが私がやっていることです。基本的に、Linux Cで一連のデータを処理するコードがあり、それを「リアルタイム」でデータをグラフ化できるC#アプリに送信する必要があります。私が行っていたのは、データをファイルに保存し、C# アプリでファイルの変更を監視してからグラフを更新することでした。しかし、それは実際にはそれほどうまく機能していませんでした。ファイルは、面白くないというよりも頻繁に変更されていることを読み取っていました。そこで、ここで親切な人たちからアドバイスを受けた後、ソケットを使用してデータを送信する方法を学ぶことにしました。

だからここに私が今やっていることがあります。ソケット スタッフを使用して C# に送信する C のデータを処理します。完全に動作します。しかし、ここに問題があります。情報を送信した後に usleep(10000) を使用するか、 getchar() を使用して各値をゆっくり送信する必要があります。そうしないと、送信された値を double に変換しようとしてエラーが発生します。

エラーは、「System.FormatException: 入力文字列が正しい形式ではありませんでした。System.Number.ParseDouble(文字列値、NumberStyles オプション、NumberFormatInfo numfmt) で」と表示されます。

sprintf(line, "%.4f", value[i][j]);
write(sock, line, 128);
usleep(10000);

ここにある例から取られた C# コード: http://www.codeproject.com/Articles/463947/Working-with-Sockets-in-Csharp

問題はここにあります:

content = Encoding.ASCII.GetString(buffer, 0, bytesRead);
chart4.Series["Graph"].Points.Add(Convert.ToDouble(content.ToString()));  

では、データの送信後に一時停止すると機能するのに、一時停止せずに送信すると機能しないのはなぜですか? 送信が速すぎますか?

また、一定のデータ フローを受信する必要がある 4 つの異なるチャートがある場合、それぞれが異なるポート番号を持つように 4 つの異なるソケットを用意して、どれがデータを受信して​​いるかを知る必要がありますか? 初心者の質問で申し訳ありません。私は自分でこのことを学ぼうとしています。私はまだ学校に通っていますが、少しでも似たようなことをまだ学んでいません。

4

1 に答える 1

2

TCP ソケットはストリームです。メッセージの概念がありません。送信が速すぎると、送信する複数の呼び出しが 1 回の呼び出しで受信され、複数の番号の一部を解析しようとする結果になります。

次のいずれかのオプションを選択することをお勧めします。

  1. 各サンプル間に区切り記号を追加します。
  2. ストリームベースではなく、メッセージベースのプロトコルを使用してください。
  3. 固定サイズのメッセージを書き込みます。たとえば、生の 8 バイトを送信し、doublea を使用しBinaryReaderてそれらを読み取ります。
于 2013-04-12T15:17:29.003 に答える