2013-03-02 66 views
0

我有一个Arduino连接到运行Arch的Raspberry Pi。如何以编程方式打开串口?

Arduino的已经没有太大的事,而是要不断地打印一些传感器数据:

#include<Arduino.h> 

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

float temp = .0; 
int lumen = 0; 

void loop() { 
    if(Serial.available()) {   
     temp = analogRead(4) * .4882812 - 273.15; 
     lumen = analogRead(0); 
     Serial.print(temp); 
     Serial.print("|"); 
     Serial.print(lumen); 
     Serial.println(); 
    } 
    delay(10); 
} 

在树莓,下面的脚本将运行:

# run.py 
#!/usr/bin/env python2 
from arduino import Arduino 
from poster import Poster 
import time 
import subprocess 
import json 

if __name__ == '__main__': 
    with open("config.json") as config_fh: 
     config = json.load(config_fh) 
     print(config) 

    base_url = config["URL"] 
    security_token = config["KEY"] 
    port = config["TTY"] 

    arduino = Arduino(port=port) 
    arduino.start() 
    time.sleep(1) 

    while True: 
     is_door_open = arduino.is_door_open() 
     temperature = arduino.get_temperature() 

     print arduino.is_door_open() 
     print arduino.get_temperature() 

#  nmap = subprocess.Popen("./networkClientsInNetwork.sh", stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
#  network_clients_count = int(nmap.stdout.readlines()[0]) 
#  print network_clients_count 

#  poster = Poster() 
#  poster.post_door_state(base_url, arduino.is_door_open(), security_token) 
#  poster.post_temperature(base_url, str(arduino.get_temperature()), security_token) 
#  poster.post_clients(base_url, str(network_clients_count), security_token) 

     time.sleep(3) 


from threading import Thread 
import serial 
import random 
import time 

这是螺纹,其不断应从串口获取数值:

class Arduino(Thread): 
    def __init__(self, port): 
     Thread.__init__(self, target=self.recieve) 
     self.daemon = True 
     self.last_recieved = None 

     self.serial = self.configure_port(port) 
     self.serial.open() 

    def configure_port(self, port_id): 
     ser = serial.Serial(port=port_id, timeout=1) 
     ser.rtscts = True 
     ser.dsrdtr = True 

     return ser 

    def recieve(self): 
     while True: 
      self.serial.flushInput() 
      self.serial.flushOutput() 
      if self.serial.isOpen(): 
       self.last_recieved = self.serial.readline().replace("\r\n", "").split("|") 

    def getLastRecieved(self): 
     return self.last_recieved 

    def is_door_open(self): 
     try: 
      lumen = int(self.getLastRecieved()[1]) 
      return_val = lumen > 150 
     except Exception: 
      return_val = None 
      pass 

     return return_val 

    def get_temperature(self): 
     try: 
      temperature = int(float(self.getLastRecieved()[0])) 
      temperature_offset = -5 
      return_val = int(temperature) + temperature_offset 
     except Exception: 
      return_val = None 
      pass 

     return return_val 

现在,当我开始run.py第一次,它永远不会从串口获取数据。他们总是会是None

当我运行

ino serial(其开始picocom

,打输入,Arduino的将其所有的数据流。如果我通过Q退出picocom,然后启动run.py,python脚本可以读取串口上的所有数据。

所以我想知道:我在创业中失踪了什么?我如何通过python使picocom自动化串口初始化?

回答

0

我已经回避问题解决此问题的工作。我改变了我的Arduino loop方法:

void loop() { 
    temp = analogRead(4) * .4882812 - 273.15; 
    lumen = analogRead(0); 
    Serial.print(temp); 
    Serial.print("|"); 
    Serial.print(lumen); 
    Serial.println(); 
    delay(10); 
} 

这将通过picocom使run.py没有魔法初始化。尽管我仍然想知道Serial.available()期望作为输入。

0

我使用下面的代码使用Python连接到我的Arduino和接收数据:

import serial 

类的Arduino():

def __init__(self): 
    try: 
     self.arduino = serial.Serial('/dev/ttyUSB0', 9600) 
     self.receivethread = threading.Thread(target=self.receive) 
     #self.receivethread.start() 
    except serial.error as message: 
     pass 
    except threading.ThreadError as message: 
     pass 
    except Exception as message: 
     pass 

def receive(self): 
    while 1: 
     if self.arduino.open(): 
      try: 
       datapacket = self.arduino.readline(30, chr(0)) 
      except Exception as message: 
       pass 
      except serial.error as message: 
       pass) 
     else: 
       pass 

    return datapacketdecoded 
0
import serial 

ser=serial.Serial('/dev/ttyUSB0', 9600, timeout=3)