0

我正在尝试从串行端口读取数据并通过 ac# GUI 将其存储在 .csv 文件中。我的数据包格式如下所示:

头字节 | 长度 | 类型 | 数据 | 尾字节

所以有两种数据

头字节 | 长度 | 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(来自 Accelerometer1x 的数据)| 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());  

顺便说一句,我已经编程了,你一定明白我对这个领域是完全陌生的! 不出所料,我收到的垃圾数据全部存储在一个列中。我只想知道我可以使用哪些可能的方法以及我在哪里犯了错误。在此先感谢您的帮助。

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());  

这应该将您的数据写入以逗号分隔的一行。

于 2013-09-02T14:03:19.837 回答