2009-08-01 14 views
6

मैं एक कंप्यूटर के साथ वायरलेस रूप से 8051 माइक्रोकंट्रोलर संचार कर रहा हूं। माइक्रोकंट्रोलर अपने सीरियल पोर्ट (डीबी 9) को एक स्ट्रिंग भेज देगा और कंप्यूटर इस स्ट्रिंग को प्राप्त करेगा और इसे कुशल बना देगा।मैं केवल एक बार 8051 से स्ट्रिंग को कैसे भेज सकता हूं?

मेरी समस्या यह है कि मुझे नहीं पता कि 8051 स्ट्रिंग को केवल एक बार कैसे प्रेषित करना है। चूंकि मुझे पीसी अंत में स्ट्रिंग में हेरफेर करने की ज़रूरत है, इसलिए इसे केवल एक बार प्राप्त करना होगा। वर्तमान में, हालांकि सी कोड में मैं एक बार स्ट्रिंग भेज रहा हूं, मेरे कंप्यूटर पर मुझे लगातार एक ही स्ट्रिंग मिल रही है। मुझे लगता है कि ऐसा इसलिए है क्योंकि एसबीयूएफ में जो कुछ भी है, वह लगातार प्रसारित होता है। क्या कोई तरीका है कि मैं केवल एक बार अपनी स्ट्रिंग भेज सकता हूं? क्या एसबीयूएफ खाली करने का कोई तरीका है?

मैंने डीबी 9 पर आरटीएस (भेजने का अनुरोध) पिन (7 वां पिन) का उपयोग करने की कोशिश की क्योंकि मैंने कहीं पढ़ा है कि अगर मैंने उस पिन पर वोल्टेज को अस्वीकार कर दिया है तो यह धारावाहिक बंदरगाह पर डेटा के प्रवाह को रोक देगा। तो मैंने जो किया वह स्ट्रिंग भेजने के लिए मेरे माइक्रोकंट्रोलर को प्रोग्राम किया गया था और उसके बाद मेरे डीबी 9 आरटीएस पिन से जुड़े आउटपुट पिन में तर्क स्तर 0 भेजा गया था। हालांकि, यह काम नहीं किया।

क्या किसी के पास कोई सुझाव है? मैं वास्तव में उनकी सराहना करता हूं।

संपादित

सॉफ्टवेयर है कि मैं पीसी पर उपयोग कर रहा हूँ XBee मॉड्यूल के लिए एक्स-सीटीयू है।

include reg51.h 
void SerTx(unsigned char); 
void main(void) 
{ 
    TMOD = 0x20; 
    TH1 = 0xFD; 
    SCON = 0x50; 
    TR1 = 1; 

    SerTx('O'); 
    SerTx('N'); 
    SerTx('L'); 
    SerTx('Y'); 

} 

void SerTx(unsigned char x) 
{ 
    SBUF = x; 
    while(TI==0); 
    TI = 0; 
} 

किसी को सत्यापित कृपया सकते हैं कि यह केवल स्ट्रिंग भेजे एक बार वास्तव में है: यह मेरा माइक्रोकंट्रोलर पर कोड है?

संपादित

स्टीव, brookesmoses तरह लग रहा है और नील सिर पर कील मारा जब वे ने कहा कि यह था कि क्या मेरी मुख्य कार्य है कि समस्या पैदा कर रहा था के बाद हो रहा था। मैंने अभी सुझाए गए कोड स्टीव को डालने की कोशिश की है (अधिक विशेष रूप से (;;); और मुख्य के बाहर सेरटेक्स को परिभाषित करना) और यह पूरी तरह से काम करता है। नियंत्रक शायद रीबूट किया गया है और इसलिए एक ही कोड खुद को दोहराता रहता है।

मदद के लिए बहुत बहुत धन्यवाद! :)

+0

मैं जिस सॉफ्टवेयर का उपयोग कर रहा हूं वह एक्सबीई मॉड्यूल के लिए एक्स-सीटीयू है। यह मेरे माइक्रोकंट्रोलर पर कोड है: # शामिल शून्य सेरटेक्स (हस्ताक्षरित चार) शून्य; शून्य मुख्य (शून्य) { \t टीएमओडी = 0x20; \t TH1 = 0xFD; \t एससीओएन = 0x50; \t TR1 = 1; \t \t \t सेरटेक्स ('ओ'); \t सेरटेक्स ('एन'); \t सेरटेक्स ('एल'); \t सेरटेक्स ('वाई'); \t शून्य सेरटेक्स (हस्ताक्षरित चार एक्स) { \t एसबीयूएफ = एक्स; \t जबकि (टीआई == 0); \t टीआई = 0; } } क्या कोई यह सत्यापित कर सकता है कि वास्तव में यह केवल एक बार स्ट्रिंग भेज रहा है? – CodeConfused

+0

कृपया अपना प्रश्न संपादित करें, और कोड के रूप में स्वरूपित कोड डालें, इसलिए इसे पढ़ना आसान है। –

+0

@CodeConfused: मुझे खुशी है कि हम सभी को एक समाधान मिला! मेरे पास आपके लिए दो और अनुरोध हैं। (1) इस प्रश्न के लिए, और स्टैक ओवरफ़्लो पर आपके सभी अन्य प्रश्नों के लिए, कृपया अपने प्रश्न के सर्वोत्तम उत्तर प्रदान करने वाले व्यक्ति द्वारा बड़ी टिक पर क्लिक करके "स्वीकृत" के रूप में एक उत्तर चिह्नित करें। यह उन अन्य लोगों के लिए उपयोगी है जिनके पास भविष्य में एक ही प्रश्न हो सकता है, क्योंकि वे तुरंत सर्वश्रेष्ठ जवाब देख सकते हैं। (2) इस प्रश्न में, कोड को कोड के रूप में प्रारूपित करें। ऐसा करने के लिए, प्रश्न संपादित करें, कोड का चयन करें, और कोड बटन दबाएं (यह उस पर 1s और 0s वाला बटन है)। धन्यवाद। –

उत्तर

6

क्या आप पुष्टि कर सकते हैं कि 8051 वास्तव में केवल एक बार डेटा भेज रहा है? जांच करने का एक तरीका यूएआरटी के TX पिन पर क्या हो रहा है यह देखने के लिए एक दायरा का उपयोग करना होगा।

पीसी पर आप किस सॉफ्टवेयर का उपयोग कर रहे हैं? मैं सरल संचार सॉफ्टवेयर जैसे हाइपरटर्मिनल या PuTTY का उपयोग करने का सुझाव दूंगा। यदि वे पीसी को कई बार स्ट्रिंग को दिखा रहे हैं, तो 8051 पर चल रहे सॉफ़्टवेयर में गलती है।

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

  1. डीबग:

    अगर मैं बहुत कुंद हो सकता है, मैं आप निम्न कर सुझाव देते हैं। चीजों को आज़माएं, लेकिन अनुमान न करें। प्रयोग। अपने कोड में छोटे बदलाव करें और देखें कि क्या होता है। आप जो कुछ भी सोच सकते हैं उसे आजमाएं। अधिक जानकारी के लिए वेब पर खोजें।

  2. यदि यह कोई समाधान नहीं उत्पन्न करता है, तो यहां वापस आएं, और हमें आवश्यक सभी जानकारी प्रदान करें। यही कारण है कि आप कदम में करने की कोशिश की के बारे में कोड के प्रासंगिक टुकड़े, हार्डवेयर आप उपयोग कर रहे का पूरा विवरण, और जानकारी शामिल है 1.

संपादित करें: मैं प्रतिनिधि प्रश्न संपादित करने के लिए नहीं है, इसलिए यहाँ कोड में अपने प्रश्न के टिप्पणी में ओपी द्वारा पोस्ट की गई है:

#include<reg51.h> 

void SerTx(unsigned char); 

void main(void) 
{ 
    TMOD = 0x20; TH1 = 0xFD; SCON = 0x50; TR1 = 1; 
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y'); 

    void SerTx(unsigned char x) 
     { SBUF = x; while(TI==0); TI = 0; } 
} 

नील के रूप में और Brooksmoses उनके जवाब में उल्लेख है, एक एम्बेडेड सिस्टम में, मुख्य कार्य समाप्त करने के लिए अनुमति कभी नहीं है। इसलिए आपको या तो अपने कोड को एक अनंत लूप में रखना होगा (जो अनजाने में हो रहा है), या अंत में एक अनंत लूप जोड़ें, इसलिए प्रोग्राम प्रभावी रूप से रोकता है।

इसके अलावा, कार्य SerTx मुख्य के बाहर परिभाषित किया जाना चाहिए। यह सिंथेटिक रूप से सही हो सकता है, लेकिन यह चीजों को सरल बनाता है अन्य कार्यों के भीतर कार्यों को घोषित नहीं करता है।

तो यह कोशिश (मैं भी कोड को समझने के लिए आसान बनाने के लिए एक प्रयास में कुछ टिप्पणियाँ जोड़ दिया है):

#include<reg51.h> 

void SerTx(unsigned char); 

void main(void) 
{ 
    /* Initialise (need to add more explanation as to what 
     each line means, perhaps by replacing these "magic 
     numbers" with some #defines) */ 
    TMOD = 0x20; 
    TH1 = 0xFD; 
    SCON = 0x50; 
    TR1 = 1; 

    /* Transmit data */ 
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y'); 

    /* Stay here forever */ 
    for(;;) {} 

} 

void SerTx(unsigned char x) 
{ 
    /* Transmit byte */ 
    SBUF = x; 

    /* Wait for byte to be transmitted */ 
    while(TI==0) {} 

    /* Clear transmit interrupt flag */ 
    TI = 0; 
} 
+0

मैं एक्सबी मॉड्यूल, स्टीव का उपयोग कर रहा हूं, इसलिए पीसी पर सॉफ़्टवेयर एक्स-सीटीयू है। हालांकि, मैंने हाइपरटेरमिनल का उपयोग करके समस्या निवारण करने का भी प्रयास किया। वही बात उस पर होती है, यानी स्ट्रिंग लगातार प्राप्त होती है। – CodeConfused

+0

बिल्कुल आप बहुत बदमाश हो सकते हैं, स्टीव! :) कुछ भी मदद करता है! आपके कोड ने चाल की, बहुत बहुत धन्यवाद। पीएस टीआई = 0 ट्रांसमीटर को अक्षम करने के लिए बिल्कुल ठीक नहीं है। टीआई को शून्य करने के लिए मजबूर होना पड़ता है क्योंकि एक चरित्र के संचरण के बाद 8051 टीआई ध्वज को संकेत देता है कि यह अधिक संचरण के लिए तैयार है। – CodeConfused

-1

इस विशेष लेख विधानसभा, नहीं सी के लिए है, लेकिन यह उपयोगी साबित हो सकता है: http://www.8052.com/tutser.phtml

2

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

आम तौर पर 8051 कोड पर प्रत्येक को स्पष्ट रूप से भेजना होता है चरित्र, लेकिन मुझे लगता है कि यह सी रन-टाइम द्वारा आपके लिए ख्याल रखा जाता है।

आरटीएस/सीटीएस (भेजने के लिए भेजने/साफ़ करने का अनुरोध) प्रवाह नियंत्रण के लिए है (यानी बफर ओवररन्स को रोकने के लिए - बफर आमतौर पर इन माइक्रोकंट्रोलर पर बहुत छोटे होते हैं) और ट्रांसमिशन को पूरी तरह से रोकना नहीं है।

6

कोड तुम्हें तैनात मुख्य() में कोई पाश है, तो आप की जरूरत है यह निर्धारित करें कि आपका कंपाइलर सी रनटाइम क्या करता है जब मुख्य() 'वाई' भेजने के बाद लौटाता है। आपकी समस्या को देखते हुए, मुझे लगता है कि संकलक कुछ क्लीनअप करने के लिए कुछ कोड उत्पन्न करता है, फिर माइक्रो को पुनरारंभ करें (शायद एक हार्डवेयर रीसेट, शायद सी रनटाइम को पुनरारंभ करना)। ऐसा लगता है कि आपका प्रोग्राम ठीक उसी तरह काम करता है जैसा आपने लिखा है, लेकिन आपने अनदेखा कर दिया है कि मुख्य() के पहले और बाद में क्या होता है।

यदि आप अपनी स्ट्रिंग को एक बार और केवल एक बार भेजना चाहते हैं, तो आपको अंतिम चरित्र भेजने के बाद while(1) {} जैसे कुछ की आवश्यकता है। लेकिन, तो आपका प्रोग्राम कुछ भी नहीं कर रहा है - यह हमेशा के लिए एक खाली पाश निष्पादित करेगा। फिर से शुरू करने के लिए एक रीसेट (जैसे पावर साइकलिंग) की आवश्यकता होती है, और स्ट्रिंग भेजती है।

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

इसके अलावा, मुख्य() के अंदर नेस्टेड परिभाषित serTx() शायद आप जो चाहते हैं वह नहीं है।

+0

धन्यवाद नील, आप बिल्कुल सही थे। लेकिन क्या हार्डवेयर को शामिल किए बिना खाली लूप से बाहर निकलने का कोई तरीका है? – CodeConfused

+0

पीएस मुझे नहीं लगता कि मेरे माइक्रो में वॉचडॉग टाइमर है। – CodeConfused

+0

मुझे लगता है कि सरल जवाब है: लूप कुछ करें। एम्बेडेड फर्मवेयर में आमतौर पर एक मुख्य पाश होता है जो हमेशा के लिए चलता है। यह लूप हार्डवेयर को यह देखने के लिए मतदान करेगा कि क्या कुछ काम है, जैसे सीरियल पोर्ट या एक बदले गए डिजिटल इनपुट से नया डेटा, फिर उस घटना से निपटने के लिए उचित फ़ंक्शन को कॉल करें। – Neil

2

नील के जवाब को गूंजते हुए (एक जवाब में, क्योंकि मेरे पास अभी तक टिप्पणी करने का प्रतिनिधि नहीं है): ओएस के बिना एक सामान्य माइक्रोकंट्रोलर स्थिति में, यह तुरंत स्पष्ट नहीं होता है कि बाहर निकलने वाले() फ़ंक्शन को स्पष्ट रूप से क्या कहा जाता है मुख्य() का अंत करना चाहिए - या, अधिक सटीक रूप से, यह सामान्य "प्रोग्राम समाप्त नहीं कर सकता है और ओएस पर वापस आ सकता है", क्योंकि वापस लौटने के लिए कोई ओएस नहीं है।

इसके अलावा, एक असली एप्लिकेशन में, आप लगभग कभी भी प्रोग्राम को बंद नहीं करना चाहते हैं, जब तक आप सिस्टम को बंद नहीं करते। तो एक बात यह है कि निकास() कार्यान्वयन निश्चित रूप से नहीं करना चाहिए, बहुत सी जगह स्थान लेना है।

कुछ प्रणालियों में मैंने काम किया है, बाहर निकलें() वास्तव में बिल्कुल लागू नहीं किया गया है - यदि आप इसका उपयोग नहीं करेंगे, तो उस पर एक बाइट भी बर्बाद न करें! इसका नतीजा यह है कि जब निष्पादन पथ मुख्य() के अंत तक पहुंच जाता है, तो चिप बस कुछ ही मेमोरी में होने वाली किसी भी चीज को निष्पादित करने की एक लाला भूमि में घूमता है, और आम तौर पर या तो लूप में फंस जाता है या एक अवैध opcode के साथ गलती। और अवैध ओपोड के साथ गलती का सामान्य परिणाम है ... चिप को रिबूट करना।

यह यहां क्या हो रहा है के लिए एक व्यावहारिक सिद्धांत की तरह लगता है।

+0

धन्यवाद ब्रूकस्मोस। आपने समझाया कि वास्तव में अच्छा है!और मुझे लगता है कि यह ठीक है कि यहाँ क्या चल रहा था। – CodeConfused

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

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