Signale an serielle Schnittstelle versenden unter Linux



  • Hallo,
    ich schreibe derzeit ein C++ Programm, welches über eine serielle Schnittstelle (eigentlich USB Bluetooth Adapter) Befehle an einen Roboter versendet. Dieser führt dann die eintreffenden Befehle aus.
    Mein Programm läuft so weit, jedoch habe ich ein Problem beim senden.

    using namespace std;
    
    int main()
    {
        //Parameter
        int fd;
        int n;
        int m;
        char buf[16];
        struct termios term_attr;
    
         // settings
        term_attr.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
        term_attr.c_iflag = 0;
        term_attr.c_oflag = OPOST | ONLCR;
        term_attr.c_lflag = 0;
    
        fd = open(DEVICE, O_RDWR);
        if (fd == -1)
        {
            cout << "Can't open device " << endl;
            return(1);
        }
        else
        cout << "device open " << endl;
    
        // transfer rate
        cfsetospeed(&term_attr,B115200);            // 115200 baud
        cfsetispeed(&term_attr,B115200);
    
        tcsetattr(fd,TCSANOW,&term_attr);
    
        char str[] = {0x77, 0x77}; // Hex
    
        m = read(fd, buf, 16);
        if (m == -1)
        {
            cout << " Error read " << endl;
        }
        else
        cout << "read: " << buf << endl;
        n = write(fd,str,sizeof(str));
        if (n ==-1)
        {
            cout << "Error write " << endl;
            return (1);
        }
        else
        cout << "Bytes are send " << endl;
        close(fd);
    
    }
    

    Ich muss sicher irgendwas bei char str[] verändern, jedoch hab ich keinen Schimmer was genau. Den ersten Befehl versendet er und wird auch korrekt ausgeführt aber der zweite leider nicht mehr.
    Es wird auch nur ein Byte gesendet, ergo muss ich irgendwie was verändern damit ich mehrere Bytes hintereinander senden kann.

    Danke schon mal

    LG



  • Ausschnitt aus der man page: (einfach man 2 write ins Terminal eingeben)

    ssize_t write(int fd, const void *buf, size_t count);
    
    ...
    
           write() writes up to count bytes from the buffer pointed buf to the file referred to by the file descriptor fd.
    
           The  number  of bytes written may be less than count if, for example, there is insufficient space on the underlying
           physical medium, or the RLIMIT_FSIZE resource limit is encountered (see setrlimit(2)), or the call was  interrupted
           by a signal handler after having written less than count bytes.  (See also pipe(7).)
    

    Du willst 2 Byte senden, es kann aber sein, dass du dafür die write Funktion 2mal aufrufen musst!
    So auf die Art:

    (Pseudecode)
    toSend=Bytecount(str)
    while(toSend>0)
    {
      currSent=write(...)
      if(currSent>=0)
        toSend=toSend-currSent
      else
       return ERROR
    
    }
    

    Ansonsten sei noch zu erwähnen, dass ein return Wert <0 normalerweise bedeutet, dass ein Fehler aufgetreten ist. Du hast immer nur auf -1 geprüft.


Anmelden zum Antworten