【问题标题】:c# saving COMport data to filec# 将 COMport 数据保存到文件
【发布时间】:2017-01-12 01:36:28
【问题描述】:

我正在尝试通过 UART 将浮点数据从 STM32 板发送到计算机。 我通过 UART 发送浮点数据为 4 帧 - 4x8bits。我已经制作了一个将这些帧转换回浮点数的函数。

我的问题是我应该怎么做才能将 1000 个浮点数堆叠到数组中,以便以后可以在 Handler 之外使用它。

class Program
{
    static void Main()
    {
        SerialPort com = new SerialPort("Com3");

        com.BaudRate = 9600;
        com.Parity = Parity.None;
        com.StopBits = StopBits.One;
        com.DataBits = 8;
        com.Handshake = Handshake.None;
        com.RtsEnable = true;

        com.DataReceived += new SerialDataReceivedEventHandler(RxHandler);
        com.Open();

        Console.WriteLine("Press any key to continue...");
        Console.ReadKey();
        com.Close();
    }

    private static void RxHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        int bytes = sp.BytesToRead;
        byte[] buffer = new byte[bytes];
        sp.Read(buffer, 0, bytes);
        Console.WriteLine(ToFloat(new byte[] { buffer[0], buffer[1], buffer[2], buffer[3] }));
    }

    static float ToFloat(byte[] input)
    {
        byte[] fArray = new[] { input[0], input[1], input[2], input[3] };
        return BitConverter.ToSingle(fArray, 0);
    }
}

【问题讨论】:

  • 使用集合的实例(例如List)来存储接收到的数据。 List<Single> list = new List<Single>(); 和 RxHandler 中的 list.Add(ToFloat(....) );
  • 在 RxHandler 错误“非静态字段、方法或属性 'Program.list' 需要对象引用时如何引用“列表”
  • 您需要在此数据链路上施加某种协议(即带有完整性检查的消息帧)。您当前的代码似乎没有使用任何东西来维护消息框架。例如。丢失一个字节,然后您开始将未对齐的数据转换为垃圾浮点值。一种方案见stackoverflow.com/questions/16177947/…
  • 对不起,因为你使用静态方法它必须被定义为静态(在static Main前面的类Program中:static List list = new List();跨度>
  • 如果您想在读取所有值后将列表写入(人类可读)文件,请将File.WriteAllLines(filename, list.Select(p => p.ToString())); 放在com.Close(); 之后

标签: c# serial-port uart rs


【解决方案1】:

这里是我添加的用于将浮点数保存到文件中的代码部分:

class Program 
{
    private static List<float> list = new List<float>();
    static void Main() {
        // see your code
        // ......
        com.Close();

        // Write list to file
        System.IO.File.WriteAllLines("data.txt", list.Select(p => p.ToString()));
        // convert list to array
        float[] floatArray = list.ToArray();
    }

    private static void RxHandler(object sender, SerialDataReceivedEventArgs e) {
        // see your code
        // ......
        sp.Read(buffer, 0, bytes);

        // store float in variable
        float f = ToFloat(new byte[] { buffer[0], buffer[1], buffer[2], buffer[3] }));
        Console.WriteLine(f);
        // add float to list
        list.Add(f);
    }

【讨论】:

    【解决方案2】:

    如果您只关心通过现有的 ToFloat 方法验证浮点字节(即作为 System.Single 值)后将它们保存在磁盘上,则可以使用 File.WriteAllBytes 例如。

    如果您想将它们保存为人类可读的表示,我想您在使用 File.WriteAllText 之前需要依赖 Single.ToString

    【讨论】:

    • 嗯,一般来说,我通常打算将我的浮点数放入数组中,然后使用它们来创建绘图。
    • @Jejh 好吧,除了问题标题“c#将 COMport 数据保存到文件”之外,我可能对您实际尝试解决的问题感到困惑。
    • 现在我想将我的数据保存到文件中
    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多