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

