当前位置: 首页 > 知识库问答 >
问题:

Arduino串行通信列表不能通过python完全发送

公良理
2023-03-14

我对通过python发送串行数据有问题。让我这样解释。我在arduino上有一个马达代码,它从串口接收数据,并在接收到的数据中移动。然而,在本例中,每当我发送8个列表中的数据时,它都不会读取第8个列表。通过玩弄时间。在python代码中睡眠我可以看到一些差异(我可以看到发送了4个列表,然后我将time.sleep增加到8,现在它发送了7个列表)我知道玩弄时间。但睡眠并不是解决办法。我还尝试清空输入和输出缓冲区,但我不知道下一步该怎么做。这是密码。Python代码:传入的字节将是发送的数据,正如您在for循环中看到的,我正在发送列表。每个列表中的前三个值用于控制函数。1,0,0意味着它将只工作于我在arduino部分共享的运动功能。第三个和第四个变量用于控制电机,这意味着第一个电机将转动2000步,另一个将转动1000步。

import time
import serial
def close():
    arduino=serial.Serial("COM4",9600)
    time.sleep(7)    
    incomingByte=[[1,0,0,2000,1000,1000],[1,0,0,200,100,1000],[1,0,0,250,650,1000],[1,0,0,1000,1000,1000],[1,0,0,2000,1000,1000],[1,0,0,200,100,1000],[1,0,0,250,650,1000],[1,0,0,1000,1000,1000]  
    length= len(incomingByte)
    for i in range(uzunluk):
       arduino.write(str.encode(str(incomingByte[i])))
       arduino.reset_input_buffer()
       arduino.reset_output_buffer()
       time.sleep(7)
    arduino.close()

close()

Arduino代码

void setup() {
  pinMode(stepPin1, OUTPUT);
  pinMode(dirPin1, OUTPUT);
  pinMode(stepPin2, OUTPUT);
  pinMode(dirPin2, OUTPUT);
  pinMode(enable,OUTPUT);
  pinMode(endstop1, INPUT);
  pinMode(endstop2, INPUT);
  Serial.begin(9600);

void motor(){

  for (i=0; i < incomingdata[3]; i++) {
     digitalWrite(stepPin1,HIGH);
     delay(2);
     digitalWrite(stepPin1,LOW);
     delay(2);
    }
  for (i=0; i < incomingdata[4]; i++) {
     digitalWrite(stepPin2,HIGH);
     delay(2);
     digitalWrite(stepPin2,LOW);
     delay(2);
    }
  act_motor=0;
  delay(incomingdata[5]);
  Serial.flush();
}

void loop() {
  if(Serial.available()){
    for (a=0; a < 6; a++) {
      incomingdata[a] = Serial.parseInt();
    }
    identifier=(incomingdata[2]);
    act_enable=(incomingdata[1]);
    act_motor=(incomingdata[0]);
  }
  if (identifier) homee();
  if (act_enable) Enable();
  if (act_motor) motor();
}

简单解释arduino代码;根据串行数据,来自每个阵列的第三和第四个数据将是步进电机移动量的步数。列表中的第五个数据是每个等待的电机的延迟时间。我希望我能解释清楚。如果有人能帮忙,我会很高兴的。如果我违反了任何规则,我很抱歉。我一定会改正我的错误。

共有1个答案

终安和
2023-03-14

你检查过阿尔杜伊诺那边的数字和顺序是正确的吗?

对于像parseInt这样的函数,您应该始终小心,因为它们只是从某个地方开始,并具有一些魔力。

我建议使用像\r\n这样的东西来分隔您的消息。然后使用普通的read(),直到找到那个序列,然后扔掉所有东西。

然后使用parseInt(如果必须的话)进行六次,然后重复并再次使用read()开始查找\r\n

 类似资料:
  • 我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。 这是我的主代码:'ulusetup(){Serial.begin(9600); }}//输出

  • 我试图用python控制总共6个LED。我使用pyserial向arduino发送一些数据,但遇到了几个问题。 我遇到的第一个问题是: 根据我在arduino上编写的代码,LEDS应该在接收到的特定数据中闪烁1秒。(这稍后会在下面解释。)但是,LEDS停留在它们应该闪烁的秒数上。这意味着如果LEDS应该闪烁10次。LEDS保持10秒并关闭。 第二个问题是: 我在代码中输入的if条件不符合顺序。正如

  • 我想用Python在我的树莓派和Arduino之间进行交流。到目前为止,Arduino成功地向Raspberry Pi发送了一条串行消息,并使用Python中的ser.readline()函数读取消息。但是当我想用IF语句闪烁连接到树莓派的led时,它就不起作用了 这是我的Arduino代码: 这是在我的Raspberry Pi上运行的Python代码: 这是我在终端中看到的:终端图像 我已经找了

  • 我已经设法从我的arduino(Uno)到我的Raspberry Pi 3,通过串口进行了写操作。 如果我在pi端使用相同的python脚本,在arduino端使用相同的Sketch,但使用Teensy,我无法从Arduino读取任何输出。 根据串行通信,arduino Uno和teensy之间有什么区别吗? Arduino草图: 我的Pi上的Python脚本: 此代码适用于我的Arduino U

  • 我在Raspberry Pi(Python脚本)和Arduino nano/uno之间的串行通信方面遇到一些问题。我的两个设备都通过USB端口连接,当我直接从arduino IDE串行监视器发送命令时,arduino草图始终正确响应: 但是,当我运行python脚本,他发送相同的命令时,草图以随机方式响应。 覆盆子终端: Arduino串行监视器: Mi代码为: Arduino草图: Python

  • 我试图让Arduino在串口读取字符“s”时触发一个中继。该字符“s”由python根据从屏幕读取的图像发送。 我的问题是arduino似乎无法从串行端口读取数据,因为它从不执行if条件。我的猜测是这两者之间存在某种死锁(这就是为什么我将ardu.close()放在函数foo中) 这是我的arduino代码: 这是我的python代码: