2012-11-09 26 views
5

पुनरारंभ करने के बाद केवल पहले संदेश पर विफल रहता है मेरे पास एक Arduino डिवाइस और पीसी है।Arduino के साथ सीरियल संचार

gpsdata data; 

char needtosend; 

void setup() {    
    Serial.begin(9600); 
    Serial.flush(); 
    data.id = 0; 
    data.src= 500; 
    data.lat= 1; 
    data.lon= 2; 
    data.alt= 3; 
    strcpy(data.date, "test date format"); 

} 

void loop() { 


    if(Serial.available() > 0) 
    { 
    needtosend = Serial.read(); 
    if (needtosend == '2') 
    { 
     data.id = ++data.id % 10; 
    } 

    byte* buff = (byte*)&data; 
    Serial.write(buff, sizeof(data)); 

    } 
    delay (200); 

} 

पीसी आवेदन सी ​​में लिखा है ++ और Arduino डिवाइस के साथ संवाद करने के लिए बढ़ावा लाइब्रेरी का उपयोग करता: मैं बोर्ड पर निम्नलिखित कोड की कोशिश की। यह पीसी कोड है:

Serial serial("/dev/ttyUSB0",9600); 
      gpsdata *data; 
      char *values = new char[sizeof(gpsdata)]; 
    while(true) 
    { 
     try { 

      serial.writeString("2",1); 
      serial.read(values,sizeof(gpsdata)); 
      data = (gpsdata *)values; 
      cout<<data->id<<endl; 
     } 
     catch(boost::system::system_error& e) 
     { 
      cout<<"Error: "<<e.what()<<endl; 
     } 
     catch(timeout_exception& e) 
     { 
      cout<<"Error: "<<e.what()<<endl; 
     } 
    } 
      delete[] values; 


Serial::Serial(std::string port, unsigned int baud_rate): io(), serial(io,port) 
{ 
    serial.set_option(boost::asio::serial_port_base::baud_rate(baud_rate)); 
} 
void Serial::read(char *data, size_t size) 
{ 
    boost::asio::read(serial,boost::asio::buffer(data,size)); 
} 

void Serial::writeString(const char* s, int length) 
{ 
    boost::asio::write(serial,boost::asio::buffer(s,length))<<std::endl; 
} 

जब मैं उपकरण को चालू और उसके बाद पहली बार के लिए पीसी आवेदन शुरू, यह स्ट्रिंग "2" डिवाइस तो पढ़ने के लिए (भेजता है) ब्लॉक और कभी नहीं से डेटा प्राप्त Arduino। अगर मैं एप्लिकेशन को मारता हूं और फिर से शुरू करने के बिना इसे फिर से शुरू करता हूं, तो सबकुछ ठीक काम करने लगता है। मैंने एसिंक पढ़ने के साथ प्रयास किया और परिणाम वही था, पहले संदेश पर पढ़ने के समय और फिर सब कुछ ठीक काम करना शुरू कर दिया। पीसी एप्लिकेशन में प्राप्त किया गया दूसरा संदेश आईडी 1 के साथ है जिसका अर्थ है कि Arduino को पहला संदेश नहीं मिला है। कोई विचार मेरी गलती कहां है?

+0

लूप() में कोड का कोई मतलब नहीं है। पढ़ने के बाद(), उपलब्ध() होने के बाद 0 होगा। जब तक पीसी एक और बाइट भेजता है। –

+0

क्षमा करें। पेस्ट त्रुटि कॉपी करें। वास्तविक कोड उपलब्ध होने के बाद पढ़ना है। मैंने पिछली पोस्ट अपडेट की। तो कोई विचार क्यों यह काम नहीं कर रहा है? –

+1

हम्म, कोड जो ** बिल्कुल ** समस्या बताता है शायद ही कभी एक कॉपी/पेस्ट गलती है। –

उत्तर

1

जैसा कि हंस द्वारा टिप्पणी में उल्लिखित है, आपका संचार प्रोटोकॉल बंद है।

आपका Arduino पाश मूल रूप से कहते हैं:

एक मूल्य पढ़ें। यदि कोई अन्य उपलब्ध मूल्य है, तो कुछ करें। 0.2 सेकंड प्रतीक्षा करें। फिर दोहराना।

अपने पीसी पाश का कहना है:

एक '2' भेजें। फिर मूल्यों की एक सरणी पढ़ें। फिर दोहराना।

आप क्या चल रहे हैं, क्या आपके संचार का आपका Arduino पक्ष भेजा जा रहा है उससे अधिक मूल्यों की प्रतीक्षा कर रहा है। Arduino पर, Serial.avaliable के लिए मतदान, और फिर पढ़ा।

पीसी पर, आपको शायद इसे बदलने की आवश्यकता नहीं है।

जब आप डिस्कनेक्ट और रीकनेक्ट करते हैं तो बॉड कनेक्शन को प्रारंभ करने के लिए एक अतिरिक्त बिट भेजा जाता है, और यह आपके प्रोटोकॉल को काम करने में धोखा दे रहा था।

संपादित करें: सीरियल लाइब्रेरी कनेक्ट होने वाली सेटिंग्स को जांचना सुनिश्चित करें। क्यूटी QextSerialPort लाइब्रेरी का उपयोग करने से पहले यहां सेटिंग्स हैं जिन्हें मैंने Arduino बोर्ड से कनेक्ट करने से पहले उपयोग किया है।

port->setFlowControl(FLOW_OFF); 
port->setParity(PAR_NONE); 
port->setDataBits(DATA_8); 
port->setStopBits(STOP_1); 
port->setTimeout(500); 

यहाँ दो लिंक है कि शायद सहायक होते हैं:

http://www.webalice.it/fede.tft/serial_port/serial_port.html

https://www.google.com/search?q=arduino+and+boost%3A%3Aasio

+0

चिपका हुआ कोड सही नहीं था। क्षमा करें मैंने पोस्ट को सही कोड से अपडेट किया है। कोई विचार क्या मैं याद कर रहा हूँ? –

+0

मैंने बूस्ट :: एएसओओ का अध्ययन नहीं किया है, लेकिन पाई सीरियल और qextserialport पुस्तकालयों के साथ, फ्लो कंट्रोल, स्टॉप बिट्स, समानता और टाइमआउट निर्दिष्ट करना महत्वपूर्ण है।मैं उन लोगों के लिए मूल्य जोड़ूंगा जो मैंने अपने उत्तर में पहले उपयोग किए हैं। – phyatt

+0

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

1

मैं अपनी परियोजनाओं में से एक में ठीक उसी व्यवहार देखा है जब बूस्ट asio और एक Arduino ऊनो का उपयोग कर Win7 पर। ऐसा प्रतीत होता है कि जब बूस्ट सीरियल पोर्ट खोलता है तो वह जो भी सिग्नल Arduino रीसेट करता है और बूटलोडर को ट्रिगर करता है (ऐसा लगता है कि Arduino IDE से कोड अपलोड करते समय ऐसा ही होता है)।

तीन संभावित समाधानों मैं ले कर आए हैं कर रहे हैं:

  1. जब Arduino गलती रीसेट (जब बूस्ट सीरियल पोर्ट खुलता है) यह कुछ सेकंड लेता है फिर से काम शुरू करने के। ऐसा लगता है कि बूटलोडर आम तौर पर कोड अपलोड शुरू करने के लिए Arduino IDE के लिए देता है। मैं चीजों को बंदरगाह खोलने के बाद एक छोटे से कुछ सेकंड इंतजार कर से बेहतर काम करने के लिए मिल सकता है:

    serial->open(strPortName); 
    SleepEx(2000,false); 
    serial->set_option(...); 
    ... 
    

    यहां तक ​​कि इस विधि के साथ मैं अब भी आम तौर पर विकृत डेटा पहले पढ़ने पर मिलता है। आमतौर पर यह अगले पढ़ने पर ठीक से काम करेगा।

  2. बूटलोडर खोना। Arduino IDE की तुलना में एक अलग विधि का उपयोग कर 6-पिन आईएसपी के माध्यम से Arduino कार्यक्रम। इसमें Arduino IDE को मिटाना और एवीआर स्टूडियो और कुछ प्रकार के हार्डवेयर आईएसपी प्रोग्रामर जैसे कुछ के साथ जाना शामिल है। यदि आप उस मार्ग पर जाते हैं तो इसका संदर्भ लें: http://www.engblaze.com/tutorial-using-atmel-studio-6-with-arduino-projects/

  3. लाइब्रेरी स्विच करें। मैंने बूस्ट का उपयोग करके उपर्युक्त व्यवहार देखा है, लेकिन बूस्ट I का उपयोग करने से पहले मैं सीटीबी लाइब्रेरी (https://iftools.com/opensource/ctb.en.php) का उपयोग कर रहा था जो काफी अच्छी तरह से काम करता था और सीरियल पोर्ट खोलते समय आर्डिनो को रीसेट नहीं करता था। मेरी प्रोजेक्ट में मैंने मूल रूप से बूस्ट को स्विच किया ताकि अन्य सुविधाओं को प्रदान किया जा सके, लेकिन मैंने संचार के लिए सीटीबी पर वापस स्विच किया क्योंकि यह बेहतर काम करता था।

एक 4 विकल्प उम्मीद है कि हमें सूचित करने के लिए कैसे Arduino (के बाद से CTB यह कर सकते हैं वहाँ एक रास्ता होना चाहिए, लेकिन मैं करने के लिए पर्याप्त विशेषज्ञ नहीं हूँ में छेड़छाड़ किए बिना बंदरगाह खोलने के लिए एक बढ़ावा asio विशेषज्ञ प्राप्त करने के लिए है बूस्ट के साथ इसे कैसे करें) जानें।

0

Arduino वेबसाइट पर एक हार्डवेयर के नजरिए से इस बात का एक बहुत ही गहन इलाज नहीं है:

  1. एक कनेक्ट करें:

    http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

    यह सहित भी इस समस्या का कुछ हार्डवेयर समाधान बताते हैं, आरईईईटी और जीएनडी लाइनों के बीच 10uF संधारित्र

  2. RESET
  3. परमा के बीच 120 ओम रोधी रखें Arduino की स्वत: रीसेट कार्यक्षमता को अक्षम करने के लिए धीरे-धीरे R3 को हटा दें।
0

बस समय पुस्तकालय आयात करें और Serial.begin(9600); लाइन के बाद time.sleep(2) जोड़ें।