向arduino发送串口命令

时间:2015-04-30 11:34:26

标签: python windows cmd arduino pyserial

我一直在努力寻找一种从我的电脑(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)

有亲切的问候 迈克尔韦德尔。

5 个答案:

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