0

シリアル ポートからデータを読み取り、ac# GUI を使用して .csv ファイルに保存しようとしています。私のパケット形式を以下に示します。

ヘッダーバイト | 長さ | タイプ | データ | データ テールバイト

つまり、データには2つのタイプがあります

ヘッダーバイト | 長さ | タイプA | センサー 1 からのデータ (2 バイト)| センサー 2 からのデータ (2 バイト) | センサー 3 からのデータ (2 バイト)| センサー 4 からのデータ (2 バイト)| センサー 5 からのデータ (2 バイト)| センサー1からのデータ(2バイト)…………など(パケット長に達するまで) | テールバイト

別のタイプにはフォーマットがあります

ヘッダーバイト | 長さ | タイプB | Accelerometer1 からのデータ x(1 バイト)| Accelerometer1y からのデータ (1 バイト) | Accelerometer1z (1 バイト) からのデータ| Accelerometer2 からのデータ x(1 バイト)| Accelerometer2y からのデータ (1 バイト) | Accelerometer2z からのデータ (1 バイト)| Accelerometer3 からのデータ x(1 バイト)| Accelerometer3y からのデータ (1 バイト) | Accelerometer3z からのデータ (1 バイト)| Accelerometer1x(1 バイト) からのデータ ………など (パケット長に達するまで) | テールバイト

今問題は、それらのそれぞれを次のような異なる列のcsvファイルに保存することです

Col1(センサー 1 からのデータ)|Col2(センサー 2 からのデータ)|Col3(センサー 3 からのデータ)|Col4(センサー 4 からのデータ)|Col5(センサー 5 からのデータ)|Col6(加速度計 1x からのデータ)| Col7(Accelerometer1y からのデータ)| Col8(Accelerometer1z からのデータ)| Col9(Accelerometer2x からのデータ)| Col10(Accelerometer2y からのデータ)| Col11(Accelerometer2z からのデータ)| Col12(Accelerometer3x からのデータ)| Col13(Accelerometer3y からのデータ)| Col14(Accelerometer3zからのデータ)|

Col1(センサー1からのデータからの次のデータ)|Col2(センサー2からのデータからの次のデータ)|Col3(センサー3からのデータからの次のデータ)|Col4(センサー4からのデータからの次のデータ)|Col5(データからの次のデータ)センサーから 5)|Col6(Accelerometer1x からのデータからの次のデータ)| Col7(Accelerometer1y からのデータからの次のデータ)| Col8(Accelerometer1z からのデータからの次のデータ)| Col9(Accelerometer2x からのデータからの次のデータ)| Col10(Accelerometer2y からのデータからの次のデータ)| Col11(Accelerometer2z からのデータからの次のデータ)| Col12(Accelerometer3x からのデータからの次のデータ)| Col13(Accelerometer3y からのデータからの次のデータ)| Col14(Accelerometer3zからのデータ)など…..

だから私は以下に示すように、今のところタイプAだけのためにそれをやろうとしていました:私はリストと配列を定義しました

    List<char> list_data = new List<char>();

次に、以下の関数でパケットからデータを抽出して保存します。

     private string bytearraytohexstring(byte[] data)
{foreach (byte b in data){
//extract data.....
list_data.Add(Convert.ToChar(b));
list_data.Add('*');
}
}

したがって、次のようにリストにデータがあります Data1 * data2 * data3 * data4 * data5 * data1 * など GUIの保存ボタンをクリックすると

              char[] store_array = new char[list_data.Count - 1];
               store_array = list_data.ToArray();
            string filePath = @"D:\data\test_no_8.csv";   

            StringBuilder sb = new StringBuilder();

            string char_array_to_str = new string(store_array);

            string[] spilt_value = char_array_to_str.Split('*');
            for (int index = 0; index < spilt_value.Length-1; index++) 
            sb.AppendLine(spilt_value[index]); 

             File.WriteAllText(filePath, sb.ToString());  

私がプログラムしたところで、あなたは私がこの分野に完全に慣れていないことを理解したに違いありません!  驚くことではありませんが、ガベージ データがすべて 1 つの列に格納されています。どのようなアプローチを使用できるか、正確にどこで間違いを犯しているのかを知りたいだけです。助けてくれてありがとう。

4

1 に答える 1

0

文字列の書き方に問題があるようです。

まず、受信データの分割ごとに新しい行を追加します。代わりに、コンマ区切りの文字列としてそれらを追加します。

もう一つは、あなたがそれを間違って数えているということです。着信文字列配列の最後のオブジェクトを省略します。

次のことを試してください。

char[] store_array = new char[list_data.Length-1];
store_array = list_data.ToArray();
string filePath = @"c:\temp\test_no_8.csv";   

StringBuilder sb = new StringBuilder();

string char_array_to_str = new string(store_array);

string[] spilt_value = char_array_to_str.Split('*');
for (int index = 0; index < spilt_value.Length; index++) {
    if(index == spilt_value.Length-1) sb.Append(spilt_value[index]); 
    else sb.Append(spilt_value[index] + ",");
}

File.WriteAllText(filePath, sb.ToString());  

これにより、データがコンマで区切られた 1 行に書き込まれます。

于 2013-09-02T14:03:19.837 に答える