You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino向Visual Studio C# Windows Form传输ADXL345数据的技术问题

解决ADXL345数据在C# WinForm中展示的问题

1. 串口通信核心配置

先确保串口参数与Arduino完全匹配(波特率、数据位等),采用异步接收避免阻塞UI:

private SerialPort _serialPort;

private void Form_Load(object sender, EventArgs e)
{
    _serialPort = new SerialPort("COM3", 9600); // 替换为你的Arduino串口号
    _serialPort.DataReceived += SerialPort_DataReceived;
    _serialPort.Open();
}

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string rawData = _serialPort.ReadLine().Trim();
    // UI更新必须通过Invoke跨线程调用
    this.Invoke(new Action(() => ProcessRawData(rawData)));
}

private void btnCloseSerial_Click(object sender, EventArgs e)
{
    if (_serialPort?.IsOpen ?? false) _serialPort.Close();
}

2. Arduino端数据格式化输出

Arduino需输出结构化数据,方便C#解析。示例格式:每个传感器的X/Y/Z用逗号分隔,4个传感器用分号分隔,末尾换行:

// Arduino代码片段
void loop() {
  // 假设已读取4个ADXL345的数据到sensors[4][3]数组
  String output = "";
  for (int i = 0; i < 4; i++) {
    output += String(sensors[i][0]) + "," + String(sensors[i][1]) + "," + String(sensors[i][2]);
    if (i != 3) output += ";";
  }
  Serial.println(output);
  delay(100); // 调整采样频率
}

3. 数据解析与DataGridView展示

在Form中拖入DataGridView,预设列名:传感器编号、X轴加速度、Y轴加速度、Z轴加速度,然后实现解析逻辑:

private void ProcessRawData(string rawData)
{
    string[] sensorGroups = rawData.Split(';');
    if (sensorGroups.Length != 4) return; // 格式错误直接跳过

    dataGridView1.Rows.Clear(); // 可选:每次刷新清空,或保留历史数据
    for (int i = 0; i < 4; i++) {
        string[] axes = sensorGroups[i].Split(',');
        if (axes.Length != 3) continue;
        // 添加数据行到表格
        dataGridView1.Rows.Add($"传感器{i+1}", axes[0], axes[1], axes[2]);
    }

    // 同步更新图表
    UpdateChart(sensorGroups);
}

4. Chart控件动态绘图

拖入Chart控件,在设计器中创建12个Series(4个传感器×3个轴),命名如Sensor1_X、Sensor1_Y等,然后实现动态更新:

private int _sampleIndex = 0; // 采样次数作为X轴坐标

private void UpdateChart(string[] sensorGroups)
{
    _sampleIndex++;
    for (int i = 0; i < 4; i++) {
        string[] axes = sensorGroups[i].Split(',');
        if (axes.Length != 3) continue;

        // 转换为浮点型并添加到对应Series
        if (float.TryParse(axes[0], out float x)) {
            chart1.Series[$"Sensor{i+1}_X"].Points.AddXY(_sampleIndex, x);
        }
        if (float.TryParse(axes[1], out float y)) {
            chart1.Series[$"Sensor{i+1}_Y"].Points.AddXY(_sampleIndex, y);
        }
        if (float.TryParse(axes[2], out float z)) {
            chart1.Series[$"Sensor{i+1}_Z"].Points.AddXY(_sampleIndex, z);
        }
    }

    // 限制显示点数,避免性能下降
    foreach (var series in chart1.Series) {
        if (series.Points.Count > 150) series.Points.RemoveAt(0);
    }
}

关键注意事项

  • 线程安全:所有UI操作必须通过Invoke执行,否则会触发跨线程异常
  • 数据校验:始终检查分割后的数组长度,避免格式错误导致崩溃
  • 资源释放:Form关闭时务必关闭串口,否则下次启动会提示串口占用
  • 性能优化:限制Chart显示的最大点数,避免数据累积导致卡顿

内容的提问来源于stack exchange,提问作者Benjamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:38:08