2011-10-18 13 views
5

मैं टर्मियो संरचना का उपयोग कर सीरियल पोर्ट को सही ढंग से स्थापित करने के लिए नहीं देख सकता, इसलिए मैं तीसरे पक्ष के पुस्तकालयों को देख रहा हूं।boost.asio का उपयोग कर मार्क और स्पेस समता संभव है?

मुझे boost.asio को आजमाने की सलाह दी गई है, लेकिन उदाहरणों को देखते हुए ऐसा लगता है कि यह चिह्न और अंतरिक्ष समानता का समर्थन नहीं करता है, क्या यह सच है?

यदि यह संभव है तो कोई boost.asio में चिह्न और स्थान समानता को कैसे करें, इस पर उदाहरण कोड दिखा सकता है। मैं 8 डेटाबेस, 115220 बॉड दर और 1 स्टॉप बिट का उपयोग कर रहा हूं।

क्या किसी को किसी तीसरे पक्ष के पुस्तकालयों के बारे में पता है जो लिनक्स पर मार्क और स्पेस समानता का समर्थन करते हैं जिसे मैं बढ़ावा देने के बजाय उपयोग कर सकता हूं?

उत्तर

5

इस समस्या पर here पर एक बहुत अच्छा लेख है।

विशेष

मार्क और अंतरिक्ष समता में, हालांकि ज्यादातर हार्डवेयर में कार्यान्वित किया, POSIX मानक में परिभाषित नहीं कर रहे हैं। यूनिक्स/लिनक्स टर्मियो लाइब्रेरी का मैनपेज, उदाहरण के लिए, इन दो समानता मोड के बारे में एक भी शब्द नहीं खोला है। (नोट PARMRK मार्क समता के साथ कोई संबंध नहीं है कि।)

यही कारण है कि, मुझे लगता है, इन विकल्पों Boost.Asio में लागू नहीं कर रहे हैं। उदाहरण के लिए :

समाधान का सुझाव था रहे हैं

मोड 8M1 (8 डेटा बिट्स, मार्क समता, 1 स्टॉप बिट) 8N2 साथ नकल करते जा सकता है। समानता बिट और स्टॉप बिट भेजने के बजाय, दो स्टॉप बिट्स प्रेषित किए जाते हैं। चूंकि स्टॉप बिट्स हमेशा 1 (मार्क बिट्स) होते हैं, दो मोड समकक्ष होते हैं।

यदि ये आपकी आवश्यकताओं से मेल नहीं खाते हैं तो आप बूस्ट एएसआईओ में अपने सीरियल पोर्ट का मूल प्रतिनिधित्व प्राप्त कर सकते हैं। डॉक्स से:

switch (value_) 
    { 
    case none: 
    storage.c_iflag |= IGNPAR; 
    storage.c_cflag &= ~(PARENB | PARODD); 
    break; 
    case even: 
    storage.c_iflag &= ~(IGNPAR | PARMRK); 
    storage.c_iflag |= INPCK; 
    storage.c_cflag |= PARENB; 
    storage.c_cflag &= ~PARODD; 
    break; 
    case odd: 
    storage.c_iflag &= ~(IGNPAR | PARMRK); 
    storage.c_iflag |= INPCK; 
    storage.c_cflag |= (PARENB | PARODD); 
    break; 
    default: 
    break; 
    } 

मुझे लगता है कि:

basic_serial_port::native_handle 

Get the native serial port representation. 

native_handle_type native_handle(); 
This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 

उपयोग के जायज़ा लेने के लिए

boost_1_45_0/boost/asio/serial_port_base.hpp 

पर और कोड विशेष रूप से एक नज़र लिनक्स पर समता के साथ क्या करना है आप फ्लैग को सेट करने के लिए native_handle का उपयोग करना चाहते हैं:

cflag |= PARENB | CMSPAR // To select SPACE parity 
cflag &= ~PARODD 

cflag |= PARENB | CMSPAR | PARODD // to select MARK parity 

(here के अनुसार, वैसे भी) भी देखें wrong sequence of libserial received data

+0

उदाहरण आप दे termios संरचना है कि मैं काम करने के लिए और CMSPAR अपने सिस्टम पर अपरिभाषित है और काम नहीं करता है नहीं मिल सका है। उत्तर के लिए धन्यवाद, वैसे भी मुझे पता है कि मुझे जावा में यह करना है :( – Skeith

+0

@ स्केथ - लिंक पर एक नज़र डालें - आप एक अतिरिक्त स्टॉप बिट (मार्क आसान है) का उपयोग करके मार्क और स्पेस दोनों का अनुकरण कर सकते हैं - यह सीधे है असमर्थित CMSPARs के साथ खेलने की आवश्यकता के बिना Boost.Asio द्वारा समर्थित।बीटीडब्लू - मुझे यकीन नहीं है कि स्विचिंग भाषा आपकी मदद करेगी यदि आपका कर्नेल इसका समर्थन नहीं करता है। – Tom

+0

हमारे पास जावा में एक प्रोग्राम है जो आउट डिवाइस से संचार करता है लेकिन मेरे पूर्ववर्ती द्वारा बनाया गया था। यदि संभव हो तो मैं सीरियल कोड को कोशिश करने और कटौती नहीं करना चाहता था क्योंकि यह सी ++ से जावा तक कार्यक्षमता कोड को फिर से लिखना एक प्रमुख काम होगा क्योंकि हम जो भी खो रहे हैं वह लिनक्स के लिए सीरियल कोड है लेकिन मेरे पास कोई विकल्प नहीं है अभी व। – Skeith

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