C#从串行端口读取数据并将其存储在不同列的csv中

C#从串行端口读取数据并将其存储在不同列的csv中,c#,serial-port,C#,Serial Port,我试图从串口读取数据,并通过c#GUI将其存储在.csv文件中。 我的数据包格式如下所示: 头字节|长度|类型|数据|尾字节 所以有两种类型的数据 报头字节|长度|类型A |来自传感器1的数据(2字节)|来自传感器2的数据(2字节)|来自传感器3的数据(2字节)|来自传感器4的数据(2字节)|来自传感器5的数据(2字节)|来自传感器1的数据(2字节)……等等(直到达到数据包长度)|尾部字节 另一种类型有一种格式 标题字节|长度|类型B |来自加速度计的数据1x(1字节)|来自加速度计的数据1x(

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

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

所以有两种类型的数据

报头字节|长度|类型A |来自传感器1的数据(2字节)|来自传感器2的数据(2字节)|来自传感器3的数据(2字节)|来自传感器4的数据(2字节)|来自传感器5的数据(2字节)|来自传感器1的数据(2字节)……等等(直到达到数据包长度)|尾部字节

另一种类型有一种格式

标题字节|长度|类型B |来自加速度计的数据1x(1字节)|来自加速度计的数据1x(1字节)|来自加速度计的数据1x(1字节)|来自加速度计的数据2x(1字节)|来自加速度计的数据2x(1字节)|来自加速度计的数据1x(1字节)|来自加速度计的数据1x(1字节)|来自加速度计的数据(1字节)|来自加速计的数据1x(1字节)…等等(直到达到数据包长度)|尾字节

现在的问题是将它们存储在csv文件中的不同列中,如

Col1(来自传感器1的数据)| Col2(来自传感器2的数据)| Col3(来自传感器3的数据)| Col4(来自传感器4的数据)| Col5(来自传感器5的数据)| Col6(来自加速度计1x的数据)| Col7(来自加速度计1y的数据)| Col8(来自加速度计1z的数据)| Col9(来自加速度计2x的数据)12410(来自加速度计2y的数据)| Col11(来自加速度计2z的数据)12412(来自加速度计3X的数据)| Col13(来自加速度计3Y的数据)| Col14(来自加速度计3Z的数据)|

Col1(来自传感器1的下一个数据)| Col2(来自传感器2的下一个数据)| Col3(来自传感器3的下一个数据)| Col4(来自传感器4的下一个数据)| Col5(来自传感器5的下一个数据)| Col6(来自加速度计1x的下一个数据)| Col7(来自加速度计1y的下一个数据)| Col8(来自加速度计1Z的下一个数据)| Col9(来自加速度计2X的下一个数据)| Col10(来自加速度计2Y的下一个数据)| Col11(来自加速度计2Z的下一个数据)| Col12(来自加速度计3X的下一个数据)| Col13(来自加速度计3Y的下一个数据)| Col14(来自加速度计3Z的数据) 等等

因此,我目前仅尝试对A型进行测试,如下所示: 我定义了一个列表和一个数组

    List<char> list_data = new List<char>();
现在我有了如下列表中的数据 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());  
char[]store_array=new char[list_data.Count-1];
store_array=list_data.ToArray();
字符串文件路径=@“D:\data\test\u no_8.csv”;
StringBuilder sb=新的StringBuilder();
string char\u array\u to\u str=新字符串(存储\u数组);
string[]spilt_value=char_array_to_str.Split('*');
对于(int index=0;index
通过我编程的方式,你一定知道我对这个领域是全新的! 毫不奇怪,我收到的垃圾数据都存储在一个列中。
我只是想知道我可以使用什么样的方法,以及我在哪里犯了错误。提前感谢您的帮助。

您在编写字符串时似乎遇到了一些问题

首先,您要在输入数据的每个分割中追加一行。您希望将它们作为逗号分隔的字符串追加

另一件事是你算错了。你会忽略输入字符串数组中的最后一个对象

请尝试以下操作:

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());  
char[]store_array=new char[list_data.Length-1];
store_array=list_data.ToArray();
字符串文件路径=@“c:\temp\test\u no_8.csv”;
StringBuilder sb=新的StringBuilder();
string char\u array\u to\u str=新字符串(存储\u数组);
string[]spilt_value=char_array_to_str.Split('*');
对于(int index=0;index

这将把数据写入一行,用逗号分隔。

您用“*”分隔但似乎您打算用逗号分隔。您将得到一列,因为您正在读取一个字节,然后添加分隔符-稍后您将根据此分隔符拆分为几行,因此每行一个字节。首先,我怀疑您是否只是想将字节转换为字符-调试为列表数据,并检查在这里,你所投入的是你想要的。这是场上双关语的道具。我从中得到了乐趣。
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());