如果在串行端口上读取字符“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/