क्या आप वर्तमान सीरियल पोर्ट की गति को क्वेरी कर सकते हैं?


9

क्या कोई कोड है जो मैं यह पता लगाने के लिए उपयोग कर सकता हूं कि एक चुने हुए सीरियल पोर्ट की गति क्या चल रही है?


1
बस एक चर में गति को परिभाषित करना आसान हो सकता है :)
अनाम पेंगुइन

क्या आपका मतलब है कि पीसी या कोई अन्य डिवाइस धारावाहिक गति सेट करता है, और Arduino मैच के लिए खुद को समायोजित करने के लिए?
डेवप

जवाबों:


7

शीर्ष स्तर नहीं है, आसान तरीका है। माफ़ करना। जब आप सीरियल पोर्ट सेटअप करते हैं तो अपने चुने हुए बॉड रेट को एक चर में स्टोर करना संभव होता है।

वैसे भी, आप AVR- आधारित के लिए क्या करने की कोशिश कर सकते हैं, हार्डवेयर UARTs Serial.beginएक विशेष बॉड दर को सेट करने के लिए क्या करता है, लेकिन यह थोड़ा दर्द है। यह बॉड दर निर्धारित करने के लिए कोड है:

  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;

  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
  {
    *_ucsra = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
  *_ubrrl = baud_setting;

आप इसके परिणाम UCSRA, UBRRH, और UBRRL रजिस्टर पढ़कर पा सकते हैं। एक uno पर वे सही रजिस्टर नाम हैं, एक मेगा पर UCSR0A, UBRR0H, UBRR0L सीरियल के लिए, UCRS1A ... serial1 और इतने पर के लिए। गैर-एवीआर बोर्ड (और Serialएक लियोनार्डो पर) पूरी तरह से अलग होंगे।

प्रत्येक बॉड दर पर एक विशेष बोर्ड (और उस बोर्ड की आवृत्ति) के लिए AVR हार्डवेयर सीरियल पोर्ट पर उन तीन रजिस्टरों के लिए एक ही राज्य होगा। आप मूल बॉड दर को बाहर निकालने के लिए एक समीकरण बना सकते हैं और प्रयास कर सकते हैं, लेकिन मैं केवल किसी प्रकार के लुकअप के साथ सीधे मूल्यों की तुलना करने की सलाह देता हूं क्योंकि पूर्णांक अंकगणितीय गोलाई त्रुटियां इसे एक बड़ी गड़बड़ बना देंगी।

उदाहरण के लिए, मेरे मेगा UBBR0H, UBBR0L, और UCSR0A पर 9600 बॉड में 0, 207, 2 हैं, लेकिन वे 38400 बॉड में 0, 51, 2 हैं और 57600 बॉड पर 0, 16, 0 हैं।


धन्यवाद यह उस तरह की चीज है जिसकी मैं तलाश कर रहा था, लेकिन जैसा कि कहा गया है कि यह अन्य विकल्पों की तुलना में मूल्य से अधिक परेशानी हो सकती है।
हेडन थ्रिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.