简体   繁体   English

从Arduino项目读取串行数据(pySerial)

[英]Reading serial data from Arduino project (pySerial)

I'm doing a test project with Raspberry pi and Arduino shield over it (Alamode). 我正在使用Raspberry pi和Arduino屏蔽对其进行测试项目(Alamode)。 I've started out with basic attempt to ready details over pySerial link, just to see i'm getting the right output before i continue to the next step, 我已经开始尝试通过pySerial链接准备详细信息,只是为了在继续下一步之前先了解到正确的输出,

Unfortunately, it didn't go as smooth as i had hopped. 不幸的是,它并没有我希望的那么顺利。

The project compiles just fine for the Arduino and when looking at the serial monitor i can see the output going out normally, then - as soon as i start the pySerial script i start to get missing chars, digits and halting of the script (claiming the serial link doesn't respond). 该项目对于Arduino来说编译的很好,当查看串行监视器时,我可以看到输出正常输出,然后-一旦我启动pySerial脚本,我就会开始丢失字符,数字和脚本中止(声明为串行链接无响应)。

The serial link carries over just fine, i've confirmed it several times and the serial monitor keeps on showing me live data. 串行链接进行得很好,我已经确认了几次,串行监视器一直在向我显示实时数据。

But for some reason it seems that the python script can't "time" or "sync" with the serial output, so it would randomly cut letters and chars. 但是由于某种原因,python脚本似乎无法与串行输出“时间”或“同步”,因此它将随机剪切字母和字符。

I've already tried changing the delay (giving it more time) or changing the baud rate and it didn't seems to help, i'm one step closer to giving up and check an alternative solution. 我已经尝试过更改延迟(给它更多的时间)或更改波特率,但这似乎没有帮助,我离放弃并检查替代解决方案仅一步之遥。

This is the basic Arduino code 这是基本的Arduino代码

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
// NOTE: For working with a faster chip, like an Arduino Due or Teensy, you
// might need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// Example to initialize DHT sensor for Arduino Due:
//DHT dht(DHTPIN, DHTTYPE, 30);

void setup() {
  Serial.begin(115200); 
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" ");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" ");
}

And this is the basic script for PySerial 这是PySerial的基本脚本

from time import sleep
import serial
ser = serial.Serial('/dev/ttyS0',115200)
counter=32
while True:
    ser.write(str(chr(counter)))
    print ser.readline(16384)
    sleep(.1)

Usually I read the serial interface like so 通常我会这样阅读串行接口

#!/usr/bin/python
# -*- coding: utf-8 -*-

import serial
import sys
import time

port = "/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AE01J6GZ-if00-port0"

baudrate = 115200

if len(sys.argv) == 3:
    ser = serial.Serial(sys.argv[1], sys.argv[2])
else:
    print "# Please specify a port and a baudrate"
    print "# using hard coded defaults " + port + " " + str(baudrate)
    ser = serial.Serial(port, baudrate)

# enforce a reset before we really start
#ser.setDTR(1)
#time.sleep(0.25)
#ser.setDTR(0)

while 1:
    sys.stdout.write(ser.readline())
    sys.stdout.flush()

The obvious difference is that you use sleep(.1) in the loop. 明显的区别是您在循环中使用sleep(.1)。 If the Arduino is sending to fast this might overflow your input buffers. 如果Arduino快速发送,这可能会使您的输入缓冲区溢出。 With my approach I never had any issues. 用我的方法,我从来没有任何问题。

Arduino code for DHT11 DHT11的Arduino代码

    #include <dht.h>
    dht DHT;
    #define DHT11_PIN 7

    void setup(){
            Serial.begin(9600);
    }

    void loop(){
            int chk = DHT.read11(DHT11_PIN);
            Serial.print("Temperature = ");  
            Serial.println(DHT.temperature);
            Serial.print("Humidity = ");
            Serial.println(DHT.humidity);
            delay(2000);
    }

python script for PySerial PySerial的python脚本

    from time import sleep
    import serial
    ser = serial.Serial("/dev/ttyACM0",9600)
    while True:
            sleep(1)
            getVal = ser.readline()
            print(getVal)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM