You need to enable JavaScript to run this app. C#与Arduino Mega通过蓝牙通信接收异常数据问题排查
优惠活动
大模型
产品
解决方案
定价
更多

C#与Arduino Mega通过蓝牙通信接收异常数据问题排查

Arduino Mega与C# Windows窗体蓝牙串口通信发数据异常解决方案

问题根因

接收值异常是由于C#侧串口参数配置不完整,与Arduino侧串口协议不匹配导致的,具体遗漏的配置项和修改方案如下:


修复步骤

1. 补全串口基础参数

Arduino侧Serial.begin(9600)默认使用**8数据位、无校验位、1停止位(8N1)**的传输协议,C# SerialPort 类默认参数可能与该协议不一致,需要在打开串口前显式指定:

serialPort1.DataBits = 8;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.StopBits = System.IO.Ports.StopBits.One;

2. 显式指定传输编码

C# SerialPort.Write(string) 会自动使用当前绑定的编码将字符串转换为字节流,默认编码并非ASCII,需要显式设置编码匹配Arduino侧的ASCII解析逻辑:

serialPort1.Encoding = System.Text.Encoding.ASCII;

3. 启用串口控制信号

绝大多数蓝牙转串口模块需要DTR、RTS控制信号处于启用状态才能正常接收上位机发送的数据,新增配置如下:

serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;

修改后完整C#串口初始化代码

所有参数配置必须在调用Open()方法前完成,修改后的初始化逻辑如下:

if (serialPort1.IsOpen) serialPort1.Close();
serialPort1.PortName = "COM" + x.ToString();
serialPort1.BaudRate = 9600;
// 新增配置项
serialPort1.DataBits = 8;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.StopBits = System.IO.Ports.StopBits.One;
serialPort1.Encoding = System.Text.Encoding.ASCII;
serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;
try
{
    if (!serialPort1.IsOpen) serialPort1.Open();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(DataReceived);

Arduino侧优化建议

接收逻辑中额外添加的delay(10)没有实际作用,反而可能导致高速传输时丢包,可以直接删除:

void loop() {
  if (Serial3.available() > 0) {
    int x = Serial3.read();
    Serial.println(x);
  }
}

内容的提问来源于stack exchange,提问作者Miquel Rodríguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:45:04