我一直在努力寻找一种从我的电脑(Windows 7)向Arduino Uno R3发送串行命令的方法。我一直在研究这个简单的程序,你应该通过USB电缆发送一个简单的“1”,以打开板载LED。我的Arduino代码应该正常工作(我所知道的,但我会确保上传它)。 我一直在尝试使用Python和pySerial发送此命令,但我似乎无法使pySerial工作。我也尝试过使用CMD,但是当我输入我的命令(ECHO 1> COM3 BAUD:9600)时,似乎CMD冻结了。 我是我PC的管理员。
这是我的arduino编码
int var = 0;
int LEDPin = 13;
int val = 0;
void setup() {
Serial.begin(9600);
pinMode(LEDPin, OUTPUT);
}
void loop() {
if (Serial.available()>0){
val = Serial.read();
}
if (val == 1){
digitalWrite(LEDPin, HIGH);
}
digitalRead(LEDPin);
if (LEDPin==HIGH){
var ++;
delay (1000);
if(var==10){
digitalWrite(LEDPin,LOW);
var = 0;
val = 0;
}
}
}
我得到的简短Python程序:)
import serial
ser = serial.Serial('COM3', 9600, timeout=0)
while 1:
var = 1
ser.write(var)
delay(12000)
有亲切的问候 迈克尔韦德尔。
答案 0 :(得分:0)
只是为了确定 - Arduino真的连接到COM3吗?
为了手动检查串行连接,您可以使用例如Putty。借助它,您可以连接到所需的串行端口并手动发送命令。并且为了检查Arduino是否收到它,您可以在Serial.println(val);
之后添加val = Serial.read();
,此Arduino应该将其收到的任何字符发送回串行。
答案 1 :(得分:0)
只需将此代码另存为.bat,并确保使用的是com 6。 此代码允许您输入命令并将命令发送到9600bpm的串行端口
mode com6:9600,N,8,1
@echo off
:start
cls
Set /p commands="enter command:"
echo|set /p= %commands% >com6
goto start
现在你必须在Arduino
中使用它读取序列号Serial.read();
答案 2 :(得分:0)
这样做对我来说更好,只需更改已连接端口的com4
@echo off
:start
cls
set /p commands="enter command:"
mode com4 baud=115200 parity=n data=8 stop=1 to=on xon=off odsr=off octs=off dtr=off rts=off idsr=off && echo %commands% > com4
cls
goto start
答案 3 :(得分:0)
我认为根本的问题在于对write
的调用中的Python代码。参数必须是字节(或兼容的东西)。您正在传递一个整数值。您需要将该值显式转换为字节对象。我不是Python专家,但是我认为实现此目标的一种方法是替换:
var = 1
使用
var = b'\x01'
哦,您可能还需要打{{1}}。
顺便说一句,您对ECHO的实验没有达到您的预期。它发送flush
的字符值49。由于49!= 1,您的Arduino代码将不响应它。
我发现测试串行命令的最简单方法是使用Arduino串行监视器,只要您匹配波特率,它就会具有所有正确的默认值。这将使您能够在调试Python代码之前确保Arduino代码正确。 (然后,可能很难通过串行监视器发送控制字符,因此请考虑在协议中使用可打印文本。例如,'1'
表示打开,'A'
表示关闭。可打印文本很容易与所有这些工具(Python,C,串行监视器,ECHO等)一起使用。
答案 4 :(得分:0)
我认为Arduino稳定且易于处理来自串行的数据,其原因是因为我在python 3中将同一个库与Pyserial一起使用的原因是读取串行事件被触发了一次,这比Arduino开发板快得多,并且解决方案,您应该使用在后台运行的线程方法,并始终尝试从串行读取传入的数据。
我已经完成了接收打开的序列号的功能:
def read_from_port(ser):
while True:
try:
reading = ser.read().decode()
handle_data(reading)
except EXCEPTION:
print("error while decoding" + str(EXCEPTION))
从列表中获得序列号并为其分配所需的波特率,然后将其发送到Thread:
serial_me = serial.Serial(serial_port1, 115200, timeout=3)
try:
thread_x = threading.Thread(target=read_from_port, args= (serial_me,))
thread_x.daemon = True
thread_x.start()
except EXCEPTION:
print('couldn\'t start thread')
print(Exception)