2012-10-20 21 views
8

मैं एक परियोजना के लिए एक धारावाहिक डिवाइस का उपयोग कर रहा हूँ, और क्या मैं पीसी पक्ष पूरा करने के लिए कोशिश कर रहा हूँ, एक कमांड धारावाहिक उपकरण द्वारा भेजे गए के लिए सुन रहा है, क्वेरी की व्याख्या, क्वेरी के आधार पर कुछ कोड चल रहा है, और वापस संचारण परिणाम।लिनक्स सीरियल पोर्ट श्रोता और दुभाषिया?

ईमानदार होने के लिए मैंने श्रोता के रूप में PHP का उपयोग करने का प्रयास किया, और यह दुर्भाग्यवश, रिसीवर के रूप में स्क्रिप्ट कार्य करने के लिए आवश्यक अनंत लूप को 25% तक CPU लोड करता है। तो यह वास्तव में सबसे अच्छा विकल्प नहीं है।

मैं cygwin का उपयोग कर रहा हूं, क्या मैं linux देशी आदेशों का उपयोग कर एक bash स्क्रिप्ट बनाने के लिए करना चाहते हैं।

मैं का उपयोग करके डेटा प्राप्त कर सकते हैं:

cat /dev/ttyS2 

और साथ जवाब भेजें:

echo "command to send" > /dev/ttyS2 

मेरा प्रश्न है, मैं कैसे एक स्वचालित श्रोता प्राप्त करते हैं और डेटा भेजने के लिए सक्षम होने के लिए कर सकता हूँ ? मुख्य मुद्दा रहा है, वास्तव में मैं कैसे बिल्ली/dev/ttyS2 आदेश रोकूँ एक बार जानकारी प्राप्त किया गया था, यह एक चर जो तब मैं एक स्विच के साथ तुलना कर सकते में डाल दिया है, वरना तो ब्लॉक की एक श्रृंखला है। बाद में एक प्रतिक्रिया वापस भेजें और चक्र फिर से शुरू करें?

धन्यवाद

+0

बैश मेरी पहली पसंद नहीं होगा। एक अच्छा समय एक छोटे से अजगर या पर्ल कोशिश करने के लिए हो सकता है - दोनों इस बात के लिए पुस्तकालयों और उदाहरण है। – stark

+0

या सी और Linux सिस्टम प्रोग्रामिंग उपयोग करके देखें। फिर भी। आप bash लिपि में कार्यक्रम के एक सर्वर ग्राहक तरह बनाने का प्रयास कर रहे हैं? – askmish

+0

मैंने सी ++ का उपयोग करने की कोशिश की है, हालांकि मैंने कभी भी इस तरह की प्रोग्रामिंग भाषा पर अपना हाथ नहीं लगाया है, इसलिए मैं असफल रहा .. बैश का उपयोग करना मुझे और अधिक समझ में आता है, क्योंकि मैं आसानी से सिग्विन के साथ विंडोज और लिनक्स दोनों अनुप्रयोगों का भी उपयोग कर सकता हूं । एक कमांड एक निष्पादन में सहेजने के लिए एक विंडोज निष्पादन योग्य या बैट फ़ाइल का उपयोग कर सकता है जिसे मैं धारावाहिक डिवाइस पर भेजता हूं, और मैं अन्य लाइन पर लिनक्स कमांड (जैसे कि wget) का उपयोग कर पूरे कार्य को लिखने के बिना उपयोग कर सकता हूं तो सी ++ में। – Matt

उत्तर

9

क्या आप यह नहीं देख रहे हैं?

while read -r line < /dev/ttyS2; do 
    # $line is the line read, do something with it 
    echo $result > /dev/ttyS2 
done 
+0

धन्यवाद, यह वही है जो मुझे चाहिए :) – Matt

+0

सिर्फ मेरे लिए है, लेकिन मेरे मामले में Arduino हर बार रीसेट किया जाता है " bubblebath

+1

@ बबलबाथ कहा जाता है: यह निश्चित रूप से संभव है, और समाधान होगा ' rici

0

यदि आप सही उपकरण का उपयोग करते हैं, तो वास्तव में आपके डिवाइस का कोई आउटपुट नहीं होने पर आपके CPU उपयोग वास्तव में 0 होना संभव है।

इसे पूरा करने के लिए, आपको कुछ उच्च स्तरीय भाषा (पर्ल, पायथन, सी/सी ++ करना होगा, लेकिन बैश नहीं) का उपयोग करना चाहिए और अपने सीरियल डिवाइस के फ़ाइल हैंडल के शीर्ष पर चुनिंदा पाश का उपयोग करना चाहिए। यह पर्ल http://perldoc.perl.org/IO/Select.html के लिए एक उदाहरण है, लेकिन आप जब तक कि यह चयन करें() syscall के लिए समर्थन हासिल है के रूप में किसी अन्य भाषा का प्रयोग कर सकते हैं।

+0

सिग्विन का उपयोग करके, श्रोता प्रक्रिया, जिसे अमीर द्वारा दिए गए लूप के साथ बनाया गया है, (जैसा कि कार्य प्रबंधक में दिखाया गया है) 0% सीपीयू और केवल 100k स्मृति का उपयोग करता है। हालांकि, सीरियल डिवाइस से अनुरोध प्राप्त होने के बाद, सीपीयू आवश्यक आउटपुट की जटिलता (जैसे regexp मिलान, वेबपृष्ठों से जानकारी प्राप्त करने के लिए कर्ल) के आधार पर स्पाइक करता है, यह 0% से 25% तक है। मुझे लगता है कि यह एक उच्च स्तरीय भाषा का उपयोग कर छोटा होगा, लेकिन मैं परिणामों से खुश हूं, क्योंकि यह 25% CPU उपयोग के साथ असीमित रूप से PHP लूप होने से कहीं बेहतर है :) – Matt

1

काफी सिस्टम स्वतंत्र रहने के लिए, क्रॉस प्लेटफ़ॉर्म प्रोग्रामिंग भाषा का उपयोग करें: Python, जैसे क्रॉस प्लेटफ़ॉर्म सीरियल लाइब्रेरी का उपयोग करें: pySerial और एक स्क्रिप्ट के अंदर प्रसंस्करण करें। मैंने pySerial का उपयोग किया है और मैं स्क्रिप्ट क्रॉस प्लेटफार्म चला सकता हूं जिसमें स्रोत कोड में लगभग कोई बदलाव नहीं आया है। बाश का उपयोग करके आप अपने आप को थोड़ा सा सीमित कर रहे हैं।

+0

एक तरह से मैं खुद को सीमित कर रहा हूं, लेकिन दूसरी तरफ हैंड बैश लिनक्स के साथ-साथ मैक में और साइगविन के माध्यम से विंडोज पर उपलब्ध है। इसके अलावा मैं किसी भी अतिरिक्त सॉफ्टवेयर/पैकेज/पुस्तकालयों का उपयोग नहीं कर रहा हूं जो देशी राज्य में क्रॉस प्लेटफ़ॉर्म उपलब्ध नहीं होंगे। सरल आदेशों का उपयोग करके 'जैसे पढ़ने-आर लाइन/dev/ttyS2' मैं आवश्यक पुस्तकालयों या सॉफ़्टवेयर की निर्भरता को हटा रहा हूं जो क्रॉस प्लेटफ़ॉर्म को पोर्ट नहीं किया जा सकता है या ओएस के साथ अलग-अलग बातचीत कर सकता है। आपकी विधि यह भी अधिक तार्किक है, मुझे लगता है, लेकिन मैं पाइथन से परिचित नहीं हूं :) – Matt

+0

विंडोज कॉम पोर्ट काम तक पहुंचने के लिए साइगविन का उपयोग कर रहा था? –

+0

@ मैट भी यदि आप साइगविन का उपयोग कर रहे हैं तो आप इसके साथ पुस्तकालय प्राप्त कर रहे हैं :) विंडोज़ –

0

मैं क्यूटी 5.1.1 के साथ C++/सी का उपयोग करने की सलाह देते हैं, यह वास्तव में आसान है और यदि आप ढांचे के साथ परिचित हैं यह केक का एक टुकड़ा हो जाएगा !!! Here आप अधिक जानकारी और here अधिक उपयोगी उदाहरण मिल जाए, यह एक कोशिश, यह वास्तव में दर्द मुफ़्त है दे सकते हैं !! इसके अलावा आप जीत पर विकसित कर सकते हैं और फिर अपना कोड लिनक्स पर भेज सकते हैं ... सीधे आगे।

इस तरह एक वस्तु घोषित:

QSerialPort mPort; //remember to #include <QtSerialPort/QSerialPort> 
//also add QT += serialport to your .pro file 

फिर इस कोड जोड़ें:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    setupUi(this); 


    connect(this->pushButton,SIGNAL(clicked()),this,SLOT(sendData())); 

    mPort.setPortName("ttyS0"); 
    mPort.setBaudRate(QSerialPort::Baud115200); 
    mPort.setParity(QSerialPort::EvenParity); 

    if(!mPort.open(QSerialPort::ReadWrite)) 
    { 
     this->label->setText(tr("unable to open port, %1").arg(mPort.error())); 
    } 

    connect(&(this->mPort),SIGNAL(readyRead()),this,SLOT(readData())); 
} 

void MainWindow::sendData() 
{ 

    QByteArray data = lineEdit->text().toLatin1(); 
    if(mPort.isOpen()) 
    { 
     mPort.write(data); 
    } 
    else 
    { 
     this->label->setText(tr("port closed %1").arg(mPort.error())); 

    } 
} 


void MainWindow::readData() 
{ 

    QString newData; 
    int bread=0; 
    while(bread < mPort.bytesAvailable()){ 
     newData += mPort.readAll(); 
     bread++; 
    } 
    this->textEdit->insertPlainText("\n" + newData); 
} 
संबंधित मुद्दे