【问题标题】:sending serial commands to arduino向arduino发送串行命令
【发布时间】:2015-04-30 11:34:25
【问题描述】:

我一直在尝试找到一种将串行命令从我的 PC (Windows 7) 发送到 Arduino Uno R3 的方法。我一直在研究这个简单的程序,你应该通过 USB 电缆发送一个简单的“1”,以便打开板载 LED。我的 Arduino 代码应该可以工作(我知道,但我会确保上传它)。 我一直在尝试使用 Python 和 pySerial 发送这个命令,但我似乎无法让 pySerial 工作。我也尝试过使用 CMD,但是当我输入命令时,CMD 似乎冻结了(ECHO 1 > COM3 BAUD:9600)。 我是我电脑的管理员。

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


    【解决方案1】:

    只是为了确定 - Arduino 真的连接到 COM3 吗?

    为了手动检查串行连接,您可以使用例如 Putty。借助它,您可以连接到所需的串行端口并手动发送命令。为了检查 Arduino 是否收到它,您可以在 val = Serial.read(); 之后添加 Serial.println(val);,这样 Arduino 应该将接收到的任何字符发送回串行。

    【讨论】:

      【解决方案2】:

      当您在 Arduino IDE 的串行监视器中键入“1”时,代码是否有效?如果是这样,请检查 COM 端口。在我的 PC(也是 Windows 7)上,COM3 从不 Arduino 端口,因为它在内部用于其他用途。

      顺便说一下,digitalRead() 语句之后的所有内容都不会执行任何操作,因为您将 LEDpin(声明为 13)与 HIGH(定义为 1)进行比较。我认为您的意思是查看 digitalRead 输出是否为高电平,但我不确定这是否会起作用,因为该引脚被声明为输出。你最好把这个逻辑放在 (val == 1) 部分。

      【讨论】:

      • 从 arduino 程序发送“1”不起作用。 arduino 接收数据(RX 闪烁),但 LED 保持关闭状态。
      • 另外,我已经按照你说的做了,并把部分从“var ++;”中移了出来。在 "if (val == 1){" 之后向上 :)
      【解决方案3】:

      只需将此代码保存为 .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();
      

      【讨论】:

      • 添加对代码的解释会很有帮助,并且会产生更好的答案..
      【解决方案4】:

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

      var = 1
      

      var = b'\x01'
      

      哦,您可能还需要致电 flush

      顺便说一句,您对 ECHO 的实验并没有达到您的预期。它发送 '1' 的字符值,即 49。由于 49 != 1,您的 Arduino 代码不会响应它。

      我发现测试串行命令的最简单方法是使用 Arduino 串行监视器,只要您匹配波特率,它将具有所有正确的默认值。这将使您能够在调试 Python 代码之前确保 Arduino 代码是正确的。 (再说一次,使用串行监视器发送控制字符可能很困难,因此请考虑在您的协议中使用可打印文本。例如,'A' 用于打开,'B' 用于关闭。可打印文本很容易使用这些工具(Python、C、串行监视器、ECHO 等)。)

      【讨论】:

        【解决方案5】:

        这样做对我来说效果更好,只需更改您连接到的端口的 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
        

        【讨论】:

          【解决方案6】:

          我认为 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-15
            • 2014-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多