2013-11-20 7 views
7

मैं एक परियोजना पर काम कर रहा हूं जिसमें मुझे रास्पबेरी पीआई में संसाधित करने के लिए एक समय में कुछ 25 वर्ण डेटा प्राप्त करना होगा। यहाँ उदाहरण कोड है कि कुछ डेटा मैं Arduino से प्राप्त करना चाहते हैं उत्पन्न करता है:पार्सियल के साथ Arduino से रास्पबेरी पाई के लिए सीरियल प्राप्त कुछ समय के बाद

char i =0; 
char a =0; 
char b=0; 


void setup(){ 

Serial.begin(9600); 
for(i=0;i<25;i++){ 

    Serial.print('l');} 
    Serial.print('\n'); 
    delay(2000); 
} 


void loop(){ 

for(i=0;i<25;i++){ 
    for(a=0;a<i;a++){ 
     if((a==9)||(a==19)||(a==24)) 
      Serial.print('l'); 
     else 
      Serial.print('d'); 
    } 
    for(b=0;b<25-i;b++){ 
      Serial.print('l'); 
    } 


    delay(2000); 
    } 
} 

यह इस तरह एक लाइन भेजता है 'llllddddllldddd ...' यह लाइन 25 वर्ण लंबाई है। अब, मैं इसे रास्पबेरी पी के साथ प्राप्त करना चाहता हूं। यहाँ कोड मैं काम करने के लिए कोशिश कर रहा हूँ है:

ser = serial.Serial('/dev/AMA0',9600,timeout=1) 
ser.open() 

try: 
    serial_data = ser.readline() 
    print serial_data 
except serial.serialutil.SerialException: 
    pass 

इस कोड की तरह के लिए 5 सेकंड के बहुत सही ढंग से डेटा प्राप्त, और फिर अचानक प्राप्त करना बंद कर देता।

इसके अलावा, जब मैं निम्नलिखित का प्रयास करता हूं, तो मुझे आउटपुट, या इनपुट/आउटपुट त्रुटियां नहीं मिलतीं।

serial_data = ser.readline() 
print serial_data 

EDIT1: ठीक है, मैं अब अपवाद टिप्पणी की।

raise SerialException('device reporst rediness to read but returned no data (device disconnected?)') 
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?) 

PySerial के माध्यम से रास्पबेरी में arduino से 25 चरित्र डेटा प्राप्त करने के लिए सही तरीका क्या है: यह निम्न त्रुटि देता है? किसी भी मदद की सराहना की जाएगी।

उत्तर

0

अपने Arduino कोड आप एक नई पंक्ति चार \n अंत कभी नहीं में अपने loop समारोह के दौरान, इस ser.readline() के साथ ही एक समस्या है क्योंकि यह एक \n चरित्र जब तक पढ़ता है।

अपने setup समारोह के दौरान आप सही ढंग से एक \n चरित्र जो समझा सकता है आरंभिक मूल्य भेजा जा रहा है, लेकिन नहीं डेटा भेजने। इस तरह अपने Arduino कोड

शायद संशोधित:

void loop(){ 
    for(i=0;i<25;i++){ 
     for(a=0;a<i;a++){ 
      if((a==9)||(a==19)||(a==24)) { 
       Serial.print('l'); 
      } else { 
       Serial.print('d'); 
      } 
     } /*end for loop a*/ 
     for(b=0;b<25-i;b++){ 
      Serial.print('l'); 
     } /*end for loop b*/ 

     Serial.print('\n'); // CODE EDITED HERE 
     delay(2000); 
    }  
} 

और इसलिए की तरह अपने अजगर कोड ...

ser = None 
try: 
    ser = serial.Serial('/dev/AMA0',9600,timeout=3) 
    ser.open() 

    while True: 
     try: 
      serial_data = ser.readline() 
      print serial_data 
     except: 
      pass 
except: 
    pass  
finally: 
    if ser: 
     ser.close() 
+0

वास्तव में मैंने पहले इसका उपयोग किया था। रास्पबेरी पक्ष पर कुछ भी नहीं बदलता है। अजीब बात यह है कि मुझे डेटा प्राप्त होता है जैसा कि मैं 5 सेकंड के लिए चाहता हूं। फिर, अचानक डेटा प्राप्त होने से रोकता है, भले ही मैंने सुनिश्चित किया कि Arduino संचार जारी है। – mozcelikors

+0

@mozcelikors हो सकता है कि आप अपने 'टाइमआउट' को 2 से बड़ा करने की कोशिश कर सकें क्योंकि आप अपने Arduino में लंबे समय तक देरी करते हैं? यह आपके पाइथन कोड (केवल डीबगिंग के लिए) में अपने 'को छोड़कर' प्रिंट प्रिंट स्टेटमेंट या कुछ जोड़ने के लायक हो सकता है, शायद सीरियल अंततः अपवाद को हिट करता है। मुझे हाल ही में एक Arduino परियोजना के साथ यह मुद्दा था। –

+0

कुछ भी नहीं है अपने अजगर कोड एक पाश में – mozcelikors

2

मैं इस एक बहुत प्राप्त करने के लिए प्रयोग किया जाता है, और फिर एक दोस्त ने मुझे करने के लिए कहा पाइथन से डेटा के लिए arduino संकेत।

नीचे

विवरण रखने पर विचार अपने अजगर कार्यक्रम द्वारा संकेत दिए arduino केवल डेटा भेजने:

prompt.py

#!/usr/bin/python 
import serial, time 
ser = serial.Serial('/dev/ttyACM0', 115200, timeout = 0.1) 

#if you only want to send data to arduino (i.e. a signal to move a servo) 
def send(theinput): 
    ser.write(theinput) 
    while True: 
    try: 
     time.sleep(0.01) 
     break 
    except: 
     pass 
    time.sleep(0.1) 

#if you would like to tell the arduino that you would like to receive data from the arduino 
def send_and_receive(theinput): 
    ser.write(theinput) 
    while True: 
    try: 
     time.sleep(0.01) 
     state = ser.readline() 
     print state 
     return state 
    except: 
     pass 
    time.sleep(0.1) 

f = open('dataFile.txt','a') 

while 1 : 
    arduino_sensor = send_and_receive('1') 
    f.write(arduino_sensor) 
    f.close() 
    f = open('dataFile.txt','a') 

शीघ्र।ino

void setup() { pinMode(13, OUTPUT); Serial.begin(115200); } 
    void loop() { 

    if (Serial.available()) { 

    ch = Serial.read(); 

    if (ch == '1') { 
     Serial.println(analogRead(A0)); // if '1' is received, then send back analog read A0 
    } 
    else if (ch == '2') {  
     digitalWrite(13,HIGH); // if '2' is received, turn on the led attached to 13 
    } 
    else if (ch == '3') { 
     digitalWrite(13,LOW); // if '3' is received then turn off the led attached 13 
    } else { 
     delay(10); 
    } 
    }  
} 

इसके अलावा, मैं एक GitHub भंडार अजगर-arduino संचार के लिए कुछ और उदाहरण है कि बनाया:

https://github.com/gskielian/Arduino-DataLogging/blob/master/PySerial/README.md

11

मैं एक ही समस्या थी और एक अच्छा समय के लिए मेरे सिर तोड़ने गया था , इस

भागो कोशिश

ps -ef | grep tty 

उत्पादन की तरह

root  2522  1 0 06:08 ?  00:00:00 /sbin/getty -L ttyAMA0 115200 vt100 

तो कुछ भी आपको लगता है कि बंदरगाह

को डेटा भेजने के आदेश रास्पबेरी Pi के सीरियल पोर्ट का उपयोग करने के प्रयास करने से गेट्टी अक्षम करने की आवश्यकता लग रहा है, तो हम गेट्टी (अक्षम करने की आवश्यकता प्रोग्राम है जो द्वारा लॉगिन स्क्रीन प्रदर्शित करता है) फ़ाइल में इस लाइन/आदि लगता है/inittab

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 

और यह के सामने # जोड़कर इसे बाहर टिप्पणी

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100) 

सीरियल पोर्ट के लिए डेटा भेजने से रास्पबेरी Pi रोकता करने के लिए जब यह जूते, /boot/cmdline.txt फाइल करने के लिए जाने के लिए और लाइन खोजने के लिए और यह

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 

रीबूट को दूर रास्पबेरी Pi

क्रेडिट जहां क्रेडिट देय है: http://blog.oscarliang.net/raspberry-pi-and-arduino-connected-serial-gpio/ मुझे गेटी

+0

यदि आप गेटी अक्षम करते हैं, और गेट्टी एल प्रदर्शित करता है ओजिन स्क्रीन, तो आप पीआई में कैसे लॉगिन करने जा रहे हैं? – Cerin

2

को रास्पबेरी पाई में जीपीएस डेटा पढ़ने के दौरान इसके साथ संघर्ष करना पड़ा। उत्पादन 10seconds के बारे में के बाद बंद करो और रिपोर्ट

device reports readiness to read but returned no data (device disconnected?) 

में लगभग सभी मंचों खरखरा साथ रास्पबेरी पाई 2 के लिए कर रहे हैं को देखते हुए समाधान होगा।

  1. enable_uart=1 सेट और /boot/config.txt में dtoverlay=pi3-disable-bt जोड़ें: मैं अंत में करने से जेसी के साथ मेरी रास्पबेरी PI3 में निरंतर जीपीएस स्ट्रीमिंग पाने के लिए निम्न में कामयाब रहे। तो रिबूट
  2. मैं

    dwc_otg.lpm_enable=0 console=tty1 console=serial0,9600 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

    करने के लिए अपने /boot/cmdline.txt बदलने के लिए तो रिबूट था

  3. रोक गेट्टी: sudo systemctl stop [email protected]

    निष्क्रिय करने के लिए: sudo systemctl stop [email protected]

आपको /boot/cmdline.txt से सावधान रहना होगा। फ़ाइल में कोई भी गलती आपके रास्पबेरी पीआई को बूट नहीं कर सकती है। संपादन से पहले फ़ाइल का बैकअप बेहतर रखना बेहतर है। बॉड दर को ठीक से सेट करें। मेरे मामले में, यह 9600 था। उम्मीद है कि यह मदद करता है!

-1

sudo rasbpi-config, इंटरफ़ेस विकल्प का चयन करें, पहले संदेश ('कर्नेल लॉगिन "),' हाँ 'को दूसरे संदेश (' सीरियल संचार") पर 'नहीं' कहें। मैंने पाया कि अगर पहला संदेश इस पर है तो त्रुटियों को फेंकता है। कह रहा है कि 'नहीं' इसे ठीक करता है।

संबंधित मुद्दे