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

C#与Arduino串口通信问题:滑块值控制舵机功能异常排查

问题分析与解决方案

嘿,我来帮你排查下问题所在!你的核心问题出在C#发送的二进制字节数据,和Arduino接收时用的Serial.parseInt()不兼容——这俩根本不是一套数据格式,难怪舵机没法正常工作啦。

为什么会出错?

Serial.parseInt()是用来读取ASCII格式的数字字符串的(比如你发送"123",它会解析成整数123),但你在C#里发送的是BitConverter.GetBytes(trackBar1.Value)生成的二进制字节:比如TrackBar值为90时,你发的是二进制的0x5A,而不是ASCII字符'9'和'0'。Arduino用parseInt()根本识别不了这种二进制数据,自然读不到正确的数值。


C#端修正方案

你的TrackBar范围是0-255,刚好是单个byte的取值范围,完全不用转成字节数组再截取,直接发送单个字节更简洁:

// 直接将TrackBar的值转为byte(范围0-255,不会溢出)
byte sendValue = (byte)trackBar1.Value;
// 发送这个单个字节
port.Write(new byte[] { sendValue }, 0, 1);

补充:你原来的BitConverter.GetBytes写法其实也没问题,因为int转字节数组后(小端模式)第一个字节就是对应0-255的值,port.Write(Numbers, 0, 1)确实能发送正确的单个字节,但问题根源还是在Arduino的接收方式。


Arduino端修正方案

把Serial.parseInt()改成读取二进制字节的方式,用Serial.read()来接收单个字节:

#include <Servo.h>
Servo myServo;

void setup() {
  myServo.attach(9); // 假设舵机接在9号引脚,根据你的实际接线调整
  Serial.begin(9600); // 注意:波特率必须和C#端串口初始化时的波特率完全一致!
}

void loop() {
  if (Serial.available() > 0) {
    // 读取单个二进制字节并转为int
    int incomingValue = Serial.read();
    // 重要:大部分舵机的有效角度范围是0-180,建议把0-255的输入映射到0-180
    int servoAngle = map(incomingValue, 0, 255, 0, 180);
    myServo.write(servoAngle);
    
    // 调试用:把接收的值打印到串口监视器,确认是否和TrackBar值一致
    // Serial.println(servoAngle);
  }
}

额外排查要点

  • 确认C#串口的波特率、数据位、停止位、奇偶校验参数,和Arduino端完全匹配。
  • 测试时可以打开Arduino的串口监视器,通过打印接收值来验证数据传输是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:42:54