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