【问题标题】:Sending integer values from RPi to Arduino serially将整数值从 RPi 串行发送到 Arduino
【发布时间】:2020-12-23 07:14:10
【问题描述】:

好吧,如果我再花一点时间在这上面,我可能会发疯。我已经阅读了许多不同的其他问题和其他网站,试图做我想做的事,但我做不到。

当前场景:我有一个在我的 Pi 上运行的程序,它从图像和 OpenCV 计算几个值。其中两个值是“脉冲计数”,我想发送到带有步进驱动器的 Arduino。

我刚刚为我的 Pi 运行了一个小测试代码

import serial
YpulseCalc = 200

serial1 = serial.Serial('/dev/ttyACM0', 9600)
serial1.flush()
YpulseCalc = str(YpulseCalc)
YpulseEncode = YpulseCalc.encode()

while True:
    if(serial1.in_waiting > 0):
        serial1.write(YpulseEncode)

我的arduino代码如下

// Initialize values needed
int yPulseCalc = 0;
int xPulseCalc = 0;

// defines pins numbers
//Front left wheel
const int stepX = 2;
const int dirX  = 5;

//Front right wheel
const int stepY = 3;
const int dirY  = 6;

//Back left wheel
const int stepZ = 4;
const int dirZ  = 7;

//Back right wheel
const int stepA = 12;
const int dirA = 13;
const int enPin = 8;

void setup() {
  Serial.begin(9600);
  // Sets the two pins as Outputs
  pinMode(stepX, OUTPUT);
  pinMode(dirX, OUTPUT);
  pinMode(stepY, OUTPUT);
  pinMode(dirY, OUTPUT);
  pinMode(stepZ, OUTPUT);
  pinMode(dirZ, OUTPUT);
  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);
  digitalWrite(dirX, HIGH);
  digitalWrite(dirY, LOW);
  digitalWrite(dirZ, HIGH);
  digitalWrite(dirA, HIGH);
}

void loop() {
  if (Serial.available() > 0) {
    yPulseCalc = Serial.read();
    xPulseCalc = Serial.read();

    Serial.print("yPulseCalc: ");
    Serial.println(yPulseCalc); 
    delay(5000);
    //Serial.print("xPulseCalc: ");
    //Serial.println(xPulseCalc);
  }
}

我不明白的一件事是,当我为 arduino 拉起串行监视器时,它是空白的,直到我单击“发送”按钮一次,即使输入框是空白的。然后它开始接收各种值,12、50、48、48、48 等......不是我发送的“200”。谁能解释一下?

我将发送的值范围从 -500 到 500。不确定这是否会改变任何编写方法。

【问题讨论】:

  • 你对这一行的理解是什么serial1.in_waiting > 0
  • 你用的是哪个arduino?
  • 使用Serial.parseInt()从串口读取字符串并将其转换为数字。

标签: python arduino raspberry-pi pyserial


【解决方案1】:

除了这个other answer

12、50、48、48 是字符串“\f200”的 ASCII 字节。看来您正在从 Python 发送数字的 ASCII 表示,并试图将接收到的字节解释为 Arduino 上的数字。

【讨论】:

    【解决方案2】:

    来自您的 Raspi 代码:

     if(serial1.in_waiting > 0):
            serial1.write(YpulseEncode)
    

    来自您的 Arduino 代码:

    if(Serial.available() > 0)
    {
      yPulseCalc = Serial.read();
      xPulseCalc = Serial.read();
      Serial.print("yPulseCalc: ");
      Serial.println(yPulseCalc); 
     ...
    

    因此,如果它们各自的输入缓冲区中至少有 1 个字节,则这两个程序仅从串行接口读取/写入串行接口。

    如果两者都在等待另一个,则不会有任何信息。

    【讨论】:

      【解决方案3】:

      1.如果您从 Raspberry 发送数据,则不必先等待传入数据,因此您可以删除 in_waiting 行:

      if(serial1.in_waiting > 0):  # remove this line
          serial1.write(YpulseEncode)
      

      2.您从 Raspberry 发送一个字符串(转换为字符串的二进制值),但在 Arduino 上您将字节读取为数字。

      所以字符串 "200" 包含字符(字节)'2', '0', '0',其 ascii 值为 50, 48, 48,这是您在 Arduino 上看到的。

      要解决这个问题,您可以在 Arduino 上读取字符串,或将值作为二进制发送。

      读取为字符串:

      • 在 Raspberry 上为字符串添加换行符:

          YpulseEncode += '\n'
          serial1.write(YpulseEncode)
        
      • 然后在 Arduino 上使用:

          String result;
        
          if(Serial.available() > 0)
          {
              result = Serial.readStringUntil('\n');
              // ...
          }
        

      更多示例请参见here

      【讨论】:

        猜你喜欢
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多