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
相关产品推荐
相关产品推荐

