2010-06-30 9 views
11

आरएस -232 संचार कभी-कभी 9-बिट बाइट्स का उपयोग करता है। इसका उपयोग बस पर कई माइक्रोकंट्रोलर के साथ संवाद करने के लिए किया जा सकता है जहां 8 बिट डेटा होते हैं और अतिरिक्त बिट एक पता बाइट इंगित करता है (डेटा के बजाए)। निष्क्रिय नियंत्रक केवल पता बाइट्स के लिए एक बाधा उत्पन्न करते हैं।क्या लिनक्स में 9-बिट धारावाहिक संचार का उपयोग करना संभव है?

क्या एक लिनक्स प्रोग्राम एक धारावाहिक डिवाइस पर 9-बिट बाइट भेज और प्राप्त कर सकता है? कैसे?

+2

क्या आप सुनिश्चित हैं कि 9वीं बिट सिर्फ समानता नहीं है? मैंने केवल 7 या 8 डेटा बिट्स + वैकल्पिक समानता बिट + 1, 1.5 या 2 स्टॉप बिट्स को देखा है। –

+1

@ पॉल आर -9 बिट सेटिंग्स असामान्य हैं, लेकिन (कम से कम उपयोग किया जाता है) समर्थित है। http://en.wikipedia.org/wiki/Serial_port#Data_bits –

+0

क्या आप उन लोगों को शामिल कर सकते हैं जो संभवतः उत्सुक हैं कि आपके पास 9 बिट सेटिंग चाहिए जो आपके पास है? –

उत्तर

5

टर्मियो सिस्टम सीधे 9 बिट ऑपरेशन का समर्थन नहीं करता है लेकिन इसे सीएमएसपीएआर ध्वज के साथ चाल चलकर कुछ प्रणालियों पर नकल किया जा सकता है। यह अनियंत्रित है और मैं सभी कार्यान्वयन में प्रकट नहीं होता हूं।

http://www.lothosoft.ch/thomas/libmip/markspaceparity.php

+0

की तरह लगता है [9-बिट प्रोटोकॉल के साथ पीसी के यूएआरटी का उपयोग करें] (http://electronicdesign.com/article/embedded/use-the-pc-s- यूआरटी-साथ-9-बिट-प्रोटोकॉल 6245.aspx) में एक कम विस्तृत लेखन है, और संकेत है कि "समानता त्रुटि" बिट का निरीक्षण और समाशोधन * प्राप्त * 9 बिट डेटा संभव हो सकता है। –

1

एक लिनक्स कार्यक्रम एक सीरियल डिवाइस पर भेज सकते हैं और 9-बिट बाइट्स प्राप्त कर सकते हैं:

यहाँ कैसे 9-बिट अनुकरण किया जाता है पर एक विस्तृत लेख के लिए एक लिंक है?

मानक यूएआरटी हार्डवेयर (8251 इत्यादि) 9-बिट-डेटा मोड का समर्थन नहीं करता है।

+0

अधिकांश यूएआरटी में केवल 8 बिट डेटा (और स्थिति) रजिस्ट्रार होते हैं, इसलिए यह स्पष्ट नहीं है कि आप 9 बिट डेटा कैसे भेज/प्राप्त करेंगे - शायद इसे 9 बिट बाइट पढ़ने के लिए दो 8 बिट्स पढ़ने/लिखने की आवश्यकता होगी? –

+0

@ पॉल आर - अमरदीप सुझाव दे सकता है कि आप प्रत्येक बाइट को प्रेषित करने से पहले स्टॉप-बिट और/या समानता-बिट सेटिंग मैन्युअल रूप से टॉगल करके करते हैं; लेकिन वह 9-बिट डेटा प्राप्त करने के लिए नहीं करेगा। – ChrisW

+1

एक 8250/16450/16550 यूएआरटी को मार्क और स्पेस समता का उपयोग कर 9वीं डेटा बिट ट्रांसमिट करने में धोखा दिया जाना चाहिए। आप मैन्युअल रूप से टॉगल शुरू नहीं कर सकते हैं और बिट्स को रोक सकते हैं। समानता त्रुटि पहचान का उपयोग करके प्राप्त किया जा सकता है। –

2

9-बिट डेटा आरएस -485 का एक मानक हिस्सा है और मल्टीड्रॉप अनुप्रयोगों में उपयोग किया जाता है। 16C950 डिवाइसों पर आधारित हार्डवेयर 9-बिट्स का समर्थन कर सकता है, लेकिन केवल अगर यूएआरटी 950 मोड में उपयोग किया जाता है (आरएस -223 के लिए उपयोग किए जाने वाले सामान्य 450/550 मोड के बजाए)।

16C950 का विवरण here पाया जा सकता है।

This पृष्ठ लिनक्स आरएस -485 समर्थन का सारांश देता है, जो हाल ही के कर्नेल (> = 3.2 आरसी 3) में बेक किया गया है।

2

9-बिट डेटा फ़्रेमिंग संभव है भले ही असली दुनिया UARTs न हो। एक पुस्तकालय मिला जो विंडोज और लिनक्स के तहत भी करता है। देखें http://adontec.com/9-bit-serial-communication.htm

2

मूल रूप से क्या वह चाहता है एक linux बॉक्स के उत्पादन के आंकड़ों के है, तो पर इसे भेजने के max232 आईसी के एक समूह के साथ एक 2 तार बस मान लीजिए -> UART या सॉफ्टवेयर RS232 कार्यान्वयन के साथ कुछ माइक्रोकंट्रोलर

जब तक अधिकतम 232 के अधिकतम आउटपुट (टीटीएल) लोड तक, व्यक्तिगत माइक्रोकंट्रोलर (उसी पीसीबी पर, उदाहरण के लिए, अलग-अलग इमारतों की बजाय) के बीच कोई वोल्टेज क्षमता समस्या नहीं होती है, तब तक कोई व्यक्ति अधिकतम अधिकतम 3232 कनवर्टर को दूर कर सकता है; (या क्लोन, या एक प्रतिरोधी और उलटा/ट्रांजिस्टर) आईसी।

मार्क या स्पेस समता के लिए लिनक्स टर्मियोस सेटिंग्स नहीं ढूंढ सकता (जो मुझे यकीन है कि हार्डवेयर यूआरटी वास्तव में समर्थन करता है, सिर्फ लिनक्स टीटी कार्यान्वयन नहीं), इसलिए हम वास्तविक समानता पीढ़ी को थोड़ा सा हैकर कर देंगे।

8 डेटा बिट्स, 2 स्टॉप बिट्स 8 डेटाबेस, 1 समानता बिट, 1 स्टॉप बिट के समान लंबाई है। (जहां पहली रोकथाम एक तर्क 1, ऋणात्मक रेखा वोल्टेज है)।

कोई 9वीं बिट को एक संकेतक के रूप में उपयोग करेगा कि अन्य 8 बिट्स व्यक्ति या माइक्रोकंट्रोलर के समूह का पता हैं, जो तब अगली बाइट्स को किसी प्रकार के कमांड या डेटा के रूप में लेते हैं, साथ ही, वे हैं 'संबोधित'।

यह 8 बिट ट्रांसपरेंट प्रदान करता है, हालांकि एक तरफ यातायात का मतलब है, 'बहुत सारी चीजें' (256 अलग-अलग चीजों), वास्तव में;) को उसी बस पर संबोधित करना है।यह एक तरीका है, क्योंकि जब कोई 2 रास्ता करना चाहता है, तो आपको 2 तार जोड़े की आवश्यकता होगी, या एकाधिक आवृत्तियों पर संशोधित करना होगा, या उसमें कॉलिशन डिटेक्शन और उसके बहुत सारे कार्यान्वयन को लागू करना होगा।

पीआईसी माइक्रोकंट्रोलर्स ehm के साथ 'कुछ प्रवंचना' 9 बिट धारावाहिक संचार कर सकते हैं (9 बिट एक और रजिस्टर में वास्तव में है;) अब

... तथ्य यह है कि लिनक्स और पसंद पर ऐसा नहीं है पर विचार - कि- सरल ...

क्या आपने बस 'पता शब्द' (जिसकी आपको 9 बिट्स की आवश्यकता है) के लिए समानता को बदलना माना है और फिर या तो इसे अजीब या यहां तक ​​कि सेट करने के लिए, इसे गणना करने के लिए सही है एक को 9वीं (समानता) बिट '1' को समानता और 8 बिट 'डेटा' के साथ चुना जाता है, फिर समानता को वापस बंद कर दें और 2 स्टॉप बिट्स चालू करें। (जो अभी तक आपके माइक्रोकंट्रोलर के संबंध में 9 बिट शब्द की लंबाई रखता है;) ... यह बहुत समय पहले है, लेकिन जहां तक ​​मुझे याद है कि स्टॉप बिट्स तब तक होते हैं जब तक चीजों के समय में डेटा बिट्स होता है।

यह किसी भी चीज पर काम करना चाहिए जो समानता के साथ 8 बिट आउटपुट, और 2 स्टॉप बिट्स के साथ कर सकता है। जिसमें पीसी हार्डवेयर और लिनक्स शामिल हैं। (और डॉस आदि)

पीसी हार्डवेयर भी विकल्प हैं बस चालू या बंद सभी शब्दों के लिए 'समता' चालू करने के लिए अगर मैं सही ढंग से याद करते हैं से (वास्तव में यह की गणना के बिना) 'पीठ में दिन का

इसके अलावा, 9 वें बिट तस्वीर डेटाशीट के बारे में बोलता है, वास्तव में आरएस -223 विनिर्देशों के समान समानता है। बस आप इसे बंद या चालू करने के लिए स्वतंत्र हैं। (पीआईसी के वैसे भी - लिनक्स में यह उससे थोड़ा अधिक जटिल है)

(लिनक्स पर कुछ टर्मियो सेटिंग्स कुछ भी हल नहीं करेंगे मुझे लगता है ... बस इसे चालू और बंद करें ... हमने बनाया है वह सामान चीज चीजें करते हैं;)

एक तस्वीर माइक्रोकंट्रोलर वास्तव में वही करता है, बस यह डेटाशीट में 'वास्तव में क्या है' जैसा प्रस्तुत नहीं किया जाता है। वे वास्तव में इसे '9वीं बिट' और इस तरह की चीजें कहते हैं। पीसी पर और इसलिए लिनक्स पर यह वही तरीके से काम करता है।

वैसे भी अगर इस चीज़ को 'दोनों तरीकों' पर काम करना चाहिए तो शुभकामनाएं इसे दो जोड़ों के साथ तारों से जोड़ना या टक्कर का पता लगाने के लिए कुछ रास्ता तय करना, जो कि 9 बिट्स प्राप्त करने से कहीं अधिक समस्याग्रस्त है।

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

#include<termios.h> 
    #include<stdio.h> 
    #include<sys/types.h> 
    #include<sys/stat.h> 
    #include<fcntl.h> 
    #include<unistd.h> 
    #include<stdint.h> 
    #include<string.h> 
    #include<stdlib.h> 

    struct termios com1pr; 
    int com1fd; 

    void bit9oneven(int fd){ 
    cfmakeraw(&com1pr); 
    com1pr.c_iflag=IGNPAR; 
    com1pr.c_cflag=CS8|CREAD|CLOCAL|PARENB; 
    cfsetispeed(&com1pr,B300); 
    cfsetospeed(&com1pr,B300); 
    tcsetattr(fd,TCSANOW,&com1pr); 
    };//bit9even 

    void bit9onodd(int fd){ 
    cfmakeraw(&com1pr); 
    com1pr.c_iflag=IGNPAR; 
    com1pr.c_cflag=CS8|CREAD|CLOCAL|PARENB|PARODD; 
    cfsetispeed(&com1pr,B300); 
    cfsetospeed(&com1pr,B300); 
    tcsetattr(fd,TCSANOW,&com1pr); 
    };//bit9odd 

    void bit9off(int fd){ 
    cfmakeraw(&com1pr); 
    com1pr.c_iflag=IGNPAR; 
    com1pr.c_cflag=CS8|CREAD|CLOCAL|CSTOPB; 
    cfsetispeed(&com1pr,B300); 
    cfsetospeed(&com1pr,B300); 
    tcsetattr(fd,TCSANOW,&com1pr); 
    };//bit9off 

    void initrs232(){ 
    com1fd=open("/dev/ttyUSB0",O_RDWR|O_SYNC|O_NOCTTY); 
    if(com1fd>=0){ 
    tcflush(com1fd,TCIOFLUSH); 
    }else{printf("FAILED TO INITIALIZE\n");exit(1);}; 
    };//initrs232 

    void sendaddress(unsigned char x){ 
    unsigned char n; 
    unsigned char t=0; 
    for(n=0;n<8;n++)if(x&2^n)t++; 
    if(t&1)bit9oneven(com1fd); 
    if(!(t&1))bit9onodd(com1fd); 
    write(com1fd,&x,1); 
    }; 

    void main(){ 

    unsigned char datatosend=0x00; //bogus data byte to send 
    initrs232(); 
    while(1){ 
    bit9oneven(com1fd); 
    while(1)write(com1fd,&datatosend,1); 
    //sendaddress(223); // address microcontroller at address 223; 
    //write(com1fd,&datatosend,1); // send an a 
    //sendaddress(128); // address microcontroller at address 128; 
    //write(com1fd,&datatosend,1); //send an a 
    } 
    //close(com1fd); 
    }; 

कुछ हद तक काम करता है .. हो सकता है कि कुछ चीजें गलत तरीके से हों लेकिन यह 9 बिट्स भेजती है। (सीएसटीओपीबी 2 स्टॉपबिट सेट करता है, जिसका अर्थ यह है कि 8 बिट ट्रांसपरेंट डेटा पर 9वी बिट = 1, मोडिंग मोड में 9वी बिट = 0;)

यह भी ध्यान रखें कि वास्तविक आरएस 232 लाइन वोल्टेज स्तर दूसरे तरीके से हैं आपका सॉफ़्टवेयर 'पढ़ता है' (जो कि 'उलटा' 5v ttl स्तर जैसा है, आपका चित्र माइक्रोक्रोनरोलर ट्रांजिस्टर या इन्वर्टर या अधिकतम 232 क्लोन आईसी से मिलता है)। (-19 वी या -10 वी (पीसी) तर्क 1 के लिए, + 1 9/+ 10 तर्क के लिए 0), रोकें बिट्स नकारात्मक वोल्टेज हैं, जैसे 1, और एक ही लंबाई।

बिट्स बाहर जाने के 0-7 (और इस मामले में: 8;) ... इसलिए शुरू बिट -> 0, 1,2,3,4,5,6,7,

यह एक सा हैकी लेकिन यह दायरे पर काम करता प्रतीत होता है। enter image description here

+0

प्राप्त करना ... कुछ हद तक अलग है। लेकिन डुप्लेक्स ऑपरेशन वैसे भी दर्द होगा ... (हार्डवेयर वार) .. लिनक्स के साथ भी प्राप्त करने के लिए आप स्वयं को एमसीयू पते पर सीमित कर सकते हैं जो rs232 समानता तर्क 1 नहीं होगी क्योंकि लिनक्स को पढ़ने का कोई तरीका नहीं है समानता बिट, केवल यह इंगित करने के लिए कि यह चयनित सेटिंग से मेल नहीं खाता है), और पहली रोकथाम भी 1 है ... लेकिन फिर आप संभावित पते में से 128 खो देते हैं। (आप 8 बिट डेटा ट्रांसपेरेंसी को रखते हैं - और अभी भी बस पर 128 एमसीयू के साथ संचार कर सकते हैं ... –

0

मैंने 9-बिट यूएआरटी इम्यूलेशन (यहां तक ​​कि विषम समानता के आधार पर) के लिए पूर्ण डेमो भी बनाया। आप इसे here पा सकते हैं।

सभी स्रोत git पर उपलब्ध हैं।

आप इसे आसानी से अपने डिवाइस के लिए अनुकूलित कर सकते हैं। उम्मीद है आप इसे पसंद करते हैं।

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

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