2012-08-08 23 views
6

के संदर्भ में परिवर्तनीय बनाने के लिए, मैं एक ArduinoMega2560 के साथ एक प्रोजेक्ट पर काम कर रहा हूं। संभव है कि अनेक सीरियल पोर्ट उपलब्ध हैं, और मैं उनमें से एक के लिए एक संदर्भ पकड़ करने के लिए एक चर, कुछ इस तरह करना चाहते हैं:अरुडिनो सीरियल ऑब्जेक्ट डेटा प्रकार, एक पोर्ट

SerialPort port; 
if (something == somethingElse) 
    port = Serial; 
else 
    port = Serial1; 

byte b = 5; 
port.write(b); 

हालांकि, Arduino प्रलेखन या तो सीमित है या मैं नहीं मिला है जो जानकारी मैं ढूंढ रहा हूं। मुझे लगता है कि मुझे इसकी क्या ज़रूरत है "सीरियल, सीरियल 1, आदि के लिए प्रकार क्या है?"।

उत्तर

9

सीरियल ऑब्जेक्ट्स के लिए अंतर्निहित सी ++ प्रकार HardwareSerial है। आप <arduino path>\hardware\arduino\cores\arduino में फ़ाइलों में पा सकते हैं। "Arduino भाषा" है, जो मेरा मानना ​​है कि छ ++, सीरियल एक वस्तु के लिए सूचक, नहीं एक रजिस्टर है सौंपने से पहले सिर्फ एक पूर्वप्रक्रमक है

HardwareSerial *port; 
if (something == somethingElse) 
    port = &Serial; 
else 
    port = &Serial1; 

byte b = 5; 
port->write(b); 
+0

यही मुझे चाहिए। आपका बहुत बहुत धन्यवाद। – Steve

+0

क्या इसे संदर्भों के साथ किया जा सकता है? तो विधि कॉल के साथ हैं। नहीं -> –

+1

@ उस्मान-पाशा: शायद लेकिन संदर्भ को परिभाषित करने के लिए यह और अधिक अजीब होगा। अनुमान में यह कुछ 'हार्डवेयरसेरियल और पोर्ट = (कुछ == कुछ भी) जैसा हो सकता है? सीरियल: सीरियल 1; बाइट बी = 5; port.write (बी); ' – tinman

0

मुझे Arduino के बारे में कुछ भी पता नहीं है, लेकिन यह आमतौर पर अधिकांश माइक्रोकंट्रोलर पर किया जाता है यह है कि आप इस मामले में सीरियल पोर्ट में सीधे पेरीहेरल के रजिस्टर क्षेत्र पर इंगित करते हैं। चलो अपने MCU मान इस तरह उन रजिस्टरों नक्शे:

// serial port 1 
0x1234 SERIAL_CONTROL_REG 
0x1235 SERIAL_DATA_REG 
0x1236 SERIAL_STATUS_REG 

// serial port 2 
0x2000 SERIAL_CONTROL_REG 
0x2001 SERIAL_DATA_REG 
0x2002 SERIAL_STATUS_REG 

फिर आप एक सूचक के साथ एक बंदरगाह का ट्रैक रख सकते, इस तरह:

#define SERIAL_PORT1 ((volatile uint8_t*)0x1234) 
#define SERIAL_PORT2 ((volatile uint8_t*)0x2000) 

typedef volatile uint8_t* serial_port_t; 
... 

serial_port_t port; 

if (something == somethingElse) 
    port = SERIAL_PORT1; 
else 
    port = SERIAL_PORT2; 

यह तो आगे तो आप कर सकते हैं कि विस्तारित किया जा सकता मैक्रो के साथ, बस चर के रूप में रजिस्टर का उपयोग उदाहरण के लिए:

#define SERIAL_CONTROL_REG(offset) (*(offset + 0)) 
#define SERIAL_DATA_REG(offset) (*(offset + 1)) 
#define SERIAL_STATUS_REG(offset) (*(offset + 2)) 

if(SERIAL_STATUS_REG(port) & some_mask) 
{ 
    SERIAL_DATA_REG(port) = 0xAA; 
} 

इस तरह आप आमतौर पर बोर्ड एक से अधिक समान पोर्ट के साथ एमसीयू बाह्य उपकरणों के लिए सामान्य हार्डवेयर ड्राइवरों लिखें।

+0

: फिर आप इस तरह कोड का उपयोग कर एक संकेत का उपयोग कर सकते हैं। उनकी भाषा त्वरित प्रोटोटाइप को बहुत आसान बनाता है, लेकिन जैसे मैंने उपरोक्त कहा है, दस्तावेज वांछित होने के लिए थोड़ा सा छोड़ देता है। – Steve

+1

@ स्टेव ओह? तो मैं दृढ़ता से लोगों को Arduino प्रोग्रामिंग के बजाय एम्बेडेड प्रोग्रामिंग सीखने की सलाह दूंगा। – Lundin

+1

यह कई मामलों में सच होगा, लेकिन जब समय कोई मुद्दा नहीं है, और विकास समय को कम से कम रखा जाना चाहिए, 'Serial.begin (9600) करना; Serial.print ("सरल पाठ आदेश"); रजिस्टरों और इंटरप्ट सेट अप करने से कहीं अधिक आसान और तेज़ है। यह मूल रूप से एक पूर्व निर्मित है, पुस्तकालय जाने के लिए तैयार किसी और ने लिखा है। – Steve

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

  • कोई संबंधित समस्या नहीं^_^