2012-02-18 11 views
7

में सीरियल पोर्ट पर STRINGS लिखना मुझे पता है कि यह प्रश्न इंटरनेट पर बिखरा हुआ है, लेकिन फिर भी, मुझे अभी तक पूरी तरह से कुछ भी नहीं मिल रहा है। मैं एक प्रोपेलर बोर्ड के लिए सी ++ (लिनक्स) में एक सीरियल पोर्ट में डेटा लिखना चाहता हूं। कंसोल से इनपुट लेते समय प्रोग्राम ठीक काम करता है, लेकिन जब मैं इसे स्ट्रिंग लिखता हूं तो हमेशा डिवाइस से ERROR - Invalid command लौटाता है। मैंने हेक्स मानों के साथ char की सरणी बनाने का प्रयास किया, फिर यह काम किया। नीचे एक कामकाजी कोड है। लेकिन मैं केवल एक स्ट्रिंग वैरिएबल प्रदान करने में सक्षम हूं और इसे सीरियल पोर्ट पर भेज सकता हूं? शायद, मैं इसे हेक्स मानों में कैसे परिवर्तित करूं यदि यह एकमात्र तरीका है? धन्यवाद सभीसी ++ लिनक्स

नोट: लूप कंसोल से उपयोगकर्ता इनपुट का उपयोग करना है। मुझे सीरियल पोर्ट में एक स्ट्रिंग वैरिएबल भेजने का एक तरीका है।

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <termios.h> 

int main(int argc,char** argv){ 
    struct termios tio; 
    struct termios stdio; 
    int tty_fd; 
    fd_set rdset; 

    unsigned char c='D'; 

    printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]); 
    memset(&stdio,0,sizeof(stdio)); 
    stdio.c_iflag=0; 
    stdio.c_oflag=0; 
    stdio.c_cflag=0; 
    stdio.c_lflag=0; 
    stdio.c_cc[VMIN]=1; 
    stdio.c_cc[VTIME]=0; 
    tcsetattr(STDOUT_FILENO,TCSANOW,&stdio); 
    tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio); 
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);  // make the reads non-blocking 

    memset(&tio,0,sizeof(tio)); 
    tio.c_iflag=0; 
    tio.c_oflag=0; 
    tio.c_cflag=CS8|CREAD|CLOCAL;   // 8n1, see termios.h for more information 
    tio.c_lflag=0; 
    tio.c_cc[VMIN]=1; 
    tio.c_cc[VTIME]=5; 

    tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);  
    cfsetospeed(&tio,B115200);   // 115200 baud 
    cfsetispeed(&tio,B115200);   // 115200 baud 

    tcsetattr(tty_fd,TCSANOW,&tio); 

    //char str[] = {'V','E','R','\r'}; 
    //the above str[] doesn't work although it's exactly the same as the following 
    char str[] = {0x56, 0x45, 0x52, 0x0D}; 
    write(tty_fd,str,strlen(str)); 
    if (read(tty_fd,&c,1)>0) 
     write(STDOUT_FILENO,&c,1); 

    while (c!='q') 
    { 
      if (read(tty_fd,&c,1)>0)  write(STDOUT_FILENO,&c,1); // if new data is available on the serial port, print it out 
      if (read(STDIN_FILENO,&c,1)>0) 
       if(c!='q') 
        write(tty_fd,&c,1);  // if new data is available on the console, send it to the serial port 
    } 

    close(tty_fd); 
} 
+0

क्या यह सी या सी ++ है? यदि सी ++, तो आप 'std :: string' का उपयोग क्यों नहीं करते? –

+0

@ बेसिलस्टारनकेविच: मैंने इसे करने का प्रयास किया है: 'std :: string str =" VER \ r "; लिखें (tty_fd, str.data(), str.size()); 'यह अभी भी त्रुटि देता है। मैंने कई तरीकों की कोशिश की है लेकिन केवल हेक्स काम करता है। क्या तुम्हारे पास कोई विचार है? कोड सी से है, लेकिन मेरा प्रोग्राम वास्तव में सी ++ है। –

+1

क्या यह मुझे है, या आपने हमें बताया नहीं है कि त्रुटि वास्तव में क्या कहती है? –

उत्तर

9

मैं अपने स्वयं के समाधान को हल करने में प्रसन्न हूं लेकिन फिर भी मामूली मामला बहुत जल्द नहीं देखा है। char डिफ़ॉल्ट रूप से signed सी ++ में है, जो इसे श्रेणी -128 से 127 तक रखता है। हालांकि, हम एएससीआईआई मानों की अपेक्षा कर रहे हैं जो 0 से 255 हैं। इसलिए यह unsigned char str[] होने की घोषणा के रूप में सरल है और बाकी सब कुछ काम करना चाहिए। मुझे मूर्ख, मुझे मूर्खतापूर्ण।

फिर भी, मेरी मदद करने के लिए सभी को धन्यवाद !!!

+0

मेरे पास पहले से ही है: डी –

2

क्या आप वाकई '\ r' के साथ समाप्त होना चाहिए? कंसोल से टेक्स्ट दर्ज करते समय रिटर्न कुंजी के परिणामस्वरूप '\ n' वर्ण (लिनक्स पर) होगा और '\ r'

अधिकांश कार्यों (open(), fcntl(), आदि) में भी त्रुटि जांच अनुपलब्ध है। शायद इन कार्यों में से एक विफल हो गया। संख्या जानने के लिए के लिए त्रुटियों आदमी पेज (open() आदेश के लिए उदाहरण के लिए man 2 open पढ़ जाँच करने के लिए। open() के मामले में आदमी पेज यह रिटर्न -1 जब यह फ़ाइल/पोर्ट नहीं खोल सके बताते हैं।

अपने संपादित करने के बाद आप ने लिखा है:।।

char str[] = {0x56, 0x45, 0x52, 0x0D}; 
write(tty_fd,str,strlen(str)); 

जो गलत है strlen एक '\ 0' समाप्त स्ट्रिंग जो str स्पष्ट रूप से तो अब नहीं है, यह आपके डेटा भेजता है और जो कुछ भी वहाँ स्मृति में है उम्मीद है जब तक यह एक तुम '\ 0' देखता है 0x00 को अपने str सरणी में जोड़ने की आवश्यकता है।

+0

द्वारा समाप्त किया जाना चाहिए, मैं सहमत हूं, मैंने उन त्रुटि जांच नहीं की हैं। लेकिन मुझे नहीं लगता कि यह समस्या का कारण है क्योंकि मौजूदा आदेश काम करते हैं (जिसका मतलब है कि कनेक्शन ठीक है)। हालांकि, यह वास्तव में अच्छा होगा अगर आप मुझे बता सकें कि मुझे जांच करनी चाहिए - ये सभी निम्न स्तर IO मेरे लिए बिल्कुल नया है। '\ r' के बारे में, मुझे नहीं लगता कि यह समस्या है, क्योंकि मैंने इस कोड का भी परीक्षण किया है और यह अभी भी वही त्रुटि देता है। 'char str [] = {'V', 0x45, 0x52, 0x0D}; लिखें (tty_fd, str, strlen (str)); '.. और साथ ही, मैंने ASCII तालिका पर जांच की है कि' 0x0D' बिल्कुल '\ r' –

+0

है और परीक्षण उद्देश्यों के लिए, मैंने' \ n' भी कोशिश की, काम भी नहीं किया –

+0

ठीक है, आपको अभी कोड को देखना बंद करना होगा। अपने सीरियल पोर्ट को किसी अन्य बॉक्स पर किसी अन्य पोर्ट से कनेक्ट करें और इन दोनों मामलों में जो भेजा जा रहा है उसे पढ़ने के लिए टर्मिनल ऐप का उपयोग करें, (जो समान होना चाहिए, लेकिन नहीं)। –

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