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

时间:2014-11-15 13:27:14

标签: python arduino pyserial

我正在用Raspberry pi和Arduino屏蔽它做一个测试项目(Alamode)。 我已经开始基本尝试通过pySerial链接准备好详细信息,只是为了看到我在继续下一步之前获得正确的输出,

不幸的是,它并没有像我跳过的那样顺利。

该项目为Arduino编译得很好,当看到串行监视器时,我可以看到输出正常输出,然后 - 一旦我启动pySerial脚本,我就开始丢失字符,数字和停止脚本(声称串行链接没有响应)。

串行链接完好无损,我已多次确认,串口监视器不断向我显示实时数据。

但由于某种原因,似乎python脚本不能"时间"或"同步"使用串行输出,所以它会随机剪切字母和字符。

我已经尝试过更改延迟(给它更多时间)或改变波特率并且它似乎没有帮助,我更接近于放弃和检查替代方案溶液

这是基本的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(" ");
}

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

2 个答案:

答案 0 :(得分:5)

通常我会像这样阅读串行接口

#!/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()

明显的区别是你在循环中使用sleep(.1)。如果Arduino发送到快速,这可能会溢出输入缓冲区。凭借我的方法,我从未遇到任何问题。

答案 1 :(得分:0)

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

PySerial的python脚本

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