发送串行命令到的Arduino

问题描述 投票:2回答:6

我一直试图找到一种方法,从我的PC(Windows 7)中发送串行命令,一个Arduino乌诺R3。我一直对这个简单的程序,在这里你应该发送一个简单的通过USB线“1”,以打开板载LED灯。我的Arduino的代码应该工作(我所知道的,但我会确保上传)。我一直在试图发送使用Python和pySerial此命令,但我似乎无法得到pySerial工作。此外,我已经使用CMD尝试过,但似乎当我在我的命令(ECHO 1> COM3波特率:9600)键入CMD一样冻结。我为我的电脑的管理员联系。

这是我的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)

随着亲切的问候迈克尔·韦代尔。

python windows cmd arduino pyserial
6个回答
0
投票

只是要确定 - 是真正的Arduino连接到COM3?

为了检查串行连接手动可以使用例如腻子。有了它的帮助,你可以连接到所需的串行端口和手动发送命令。而为了检查是否Arduino的接受了它,你可以Serial.println(val);之后添加val = Serial.read();,与此Arduino的应发回它接收串行任何字符。


0
投票

是否代码工作,当你键入“1”到Arduino的IDE串口监视器?如果是这样,检查COM端口。在我的电脑(也是Windows 7),COM3从来都不是Arduino的端口,因为它是内部使用别的东西。

通过digitalRead()语句之后事情的发展方向不会做任何事情,因为你比较LEDpin(被声明为13)到高(定义为1)。我想你的意思是,看看是否digitalRead输出高,但我不知道,将工作,或者说,由于销被声明为输出。你会好得多把这种逻辑在(VAL == 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();

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

0
投票

我认为问题的根源是在调用write的Python代码。该参数必须是字节(或东西兼容)。你传递一个整数值。您需要在值显式转换为字节对象。我不是一个Python的专家,但我认为这样做的一个方法是更换:

var = 1

var = b'\x01'

哦,你可能需要调用flush为好。

顺便说一句,用ECHO您的实验没有做你的原意。它发送字符值'1',这是49.自49!= 1,你的Arduino的代码不会对此作出回应。

我觉得测试串行命令的最简单方法是使用Arduino的串行监视器,这将有所有正确的默认设置,只要你匹配的波特率。这将使您能够确保Arduino的代码调试Python代码之前。 (话又说回来,它可能难以与串行监视器发送控制字符,所以考虑在协议使用可打印文本。例如'A'上和'B'为关闭。可打印文本可以很容易与所有这些工具中(Python的工作,C,串行监视器,ECHO等)。)


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)) 

我有从列表中序列后,并与所需的波特率分配,并将其发送到主题:

     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)
© www.soinside.com 2019 - 2024. All rights reserved.