如果试图在串行端口上读取字符“ s”,我试图使Arduino触发继电器。
字符“ s”由python根据从屏幕读取的图像发送。

我的问题是arduino似乎无法从串行端口读取,因为它从不执行if条件。
我的猜测是两者之间存在某种死锁(这就是为什么我将ardu.close()放在函数foo中的原因)

这是我的arduino代码:

char serial;
#define RELAY1  7
void setup()

{


Serial.begin(9600);
  pinMode(RELAY1, OUTPUT);

}

  void loop()

{


if(Serial.available() > 0){
    serial = Serial.read();
    //Serial.print(serial);
    if(serial=='s'){
      digitalWrite(RELAY1,0);
   Serial.println("Light ON");
   delay(2000);

   digitalWrite(RELAY1,1);
   Serial.println("Light OFF");
   delay(2000);
      }
      }
}


这是我的python代码:

import time
import serial
#from serial import serial
import cv2
import mss
import numpy
import pytesseract

def foo():
    print("sent")
    ardu= serial.Serial('COM6',9600, timeout=.1)
    time.sleep(1)
    ardu.write('s'.encode())
    time.sleep(1)
    ardu.close()


foo()

最佳答案

要从Windows机器与Arduino开发板通信,您必须安装PySerial。请参阅此处的说明在计算机上安装PySerial:PySerial website

并且,请确保已为您的板安装了正确的串行驱动程序。这应该与您的主板软件一起安装。但是,如果您需要手动进行操作,以下两个链接可能会有所帮助,
Sparkfun driver instructions

Arduino driver instructions

然后,请确保您使用正确的com端口。运行arduino IDE,将程序上载到arduino,然后在“工具”菜单下(在IDE中),设置com端口并运行串行监视器。然后,在串行监视器中,输入“ s”并确认您看到灯亮,灯灭的消息。

这是您的arduino和python代码,去除了用于演示示例的最少指令集,外加一个println()语句(在arduino代码中)以十六进制形式回显接收到的字符。该调试语句将帮助您在开发代码时整理换行等。

更改继电器的引脚号和端口的设备名称后,此处列出的代码在我的板子和Linux机器上都可以使用。将close()注释掉只是为了向您显示它不需要该行就可以工作。

在arduino上:

#include <stdlib.h>

char serial;
#define RELAY1  7
void setup()
{
  Serial.begin(9600);
  pinMode(RELAY1, OUTPUT);
}

void loop()
{
  if(Serial.available() > 0)
  {
      serial = Serial.read();
      Serial.println( serial, HEX);
      if (serial=='s')
      {
        digitalWrite(RELAY1,0);
        Serial.println("Light ON");
        delay(2000);
        digitalWrite(RELAY1,1);
        Serial.println("Light OFF");
        delay(2000);
      }
   }
}


python代码:

import time
import serial

def foo():
    print("sent")
    ardu= serial.Serial('/dev/ttyACM0',9600, timeout=.1)
    time.sleep(1)
    ardu.write('s'.encode())
    time.sleep(1)
    #ardu.close()


foo()

关于python - 通过串行端口将数据从python发送到Arduino,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52683720/

10-16 07:28