Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将整数值从RPi串行发送到Arduino_Python_Arduino_Raspberry Pi_Pyserial - Fatal编程技术网

Python 将整数值从RPi串行发送到Arduino

Python 将整数值从RPi串行发送到Arduino,python,arduino,raspberry-pi,pyserial,Python,Arduino,Raspberry Pi,Pyserial,好吧,如果我再花一分钟在这上面,我可能会发疯。我读过很多不同的问题和其他网站,试图做我想做的事,但我做不到 当前场景:我有一个在我的Pi上运行的程序,该程序从图像和OpenCV计算一对值。其中两个值是“脉冲计数”,我想发送给Arduino,附带步进驱动程序 我刚刚为我的Pi运行了一个小测试代码 导入序列号 YpulseCalc=200 serial1=serial.serial('/dev/ttyACM0',9600) serial1.flush() YpulseCalc=str(YpulseC

好吧,如果我再花一分钟在这上面,我可能会发疯。我读过很多不同的问题和其他网站,试图做我想做的事,但我做不到

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

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

导入序列号
YpulseCalc=200
serial1=serial.serial('/dev/ttyACM0',9600)
serial1.flush()
YpulseCalc=str(YpulseCalc)
YpulseEncode=YpulseCalc.encode()
尽管如此:
如果(serial1.in_waiting>0):
serial1.写入(YpulseEncode)
我的arduino代码如下

//需要初始化值
int yPulseCalc=0;
int xPulseCalc=0;
//定义管脚编号
//左前轮
常数int stepX=2;
常数int dirX=5;
//右前轮
常数int stepY=3;
常数int dirY=6;
//左后轮
常数int stepZ=4;
常数int dirZ=7;
//右后轮
常数int stepA=12;
常数int dirA=13;
常数int enPin=8;
无效设置(){
Serial.begin(9600);
//将两个管脚设置为输出
pinMode(步进,输出);
pinMode(dirX,输出);
pinMode(stepY,输出);
pinMode(dirY,输出);
pinMode(步进,输出);
pinMode(dirZ,输出);
pinMode(enPin,输出);
数字写入(enPin,低电平);
数字写入(dirX,高);
数字写入(dirY,低位);
数字写入(dirZ,高);
数字写入(dirA,高);
}
void循环(){
如果(Serial.available()>0){
yPulseCalc=Serial.read();
xPulseCalc=Serial.read();
串行打印(“yPulseCalc:”);
串行打印LN(yPulseCalc);
延迟(5000);
//串行打印(“xPulseCalc:”);
//Serial.println(xPulseCalc);
}
}
有一件事我不明白,当我拔出arduino的串行监视器时,它是空的,直到我点击“发送”按钮一次,即使输入框是空的。然后它开始接收各种值,12、50、48、48、48等等。。。不是我寄来的“200”。有人能解释一下吗

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

从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个字节,则这两个程序只能从串行接口读/写

如果双方都在等待另一方,则不会进行任何通信。

除此之外:


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

1。如果您从树莓发送数据,您不必首先等待传入数据,因此您可以删除等待中的
行:

if(serial1.in_waiting > 0):  # remove this line
    serial1.write(YpulseEncode)
2.从树莓中发送一个字符串(一个二进制值转换为字符串),但在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');
          // ...
      }
    

有关更多示例,请参阅。

您对这行
serial1.in_waiting>0的理解如何?您使用的是哪种arduino?使用
Serial.parseInt()
从串口读取字符串并将其转换为数字。