Проблема инициализации с помощью termios - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь создать мобильного автономного робота от аппаратного интерфейса до навигации и планирования пути. Я использую irobot create2 в настоящее время и у меня проблемы с настройкой последовательной связи для инициализации. У меня был какой-то другой код, который его инициализировал, но данные, которые он выдавал, были чепухой. Я начал с нуля, и теперь робот не включается, когда я запускаю программу.

Я действительно полон решимости создать интерфейс с помощью основных системных вызовов C с использованием termios. Я верю, что если я смогу понять эти концепции, то существует бесконечная возможность манипулирования электроникой. Я написал несколько сценариев, использующих termios, устанавливающих скорость передачи данных и заданные флаги на основе требуемых настроек последовательного порта для связи с create. Я нашел примеры, но я думаю, что мне не хватает некоторых фундаментальных понятий, которые могут быть объяснены некоторыми советами по моему коду. Я прочитал всю документацию по termios и попытался проанализировать драйвер, который уже существует для создания, но мне не удалось выяснить мою проблему при инициализации бота и отправке необходимых последовательных последовательностей.

У меня есть заголовочный файл, файл определения функции и основной файл, который можно найти здесь:

   *yungBot.cpp:*

    #include "yungBot.h"
    #include <iostream>


    int yungBot::init(const char *yungin){

            fd = open(yungin, O_RDWR | O_NOCTTY | O_NDELAY);

            if(fd == -1){ 
                perror("Error, failed to connect");
            }
            else{
                fcntl(fd,F_SETFL,0);
                tcflush (fd, TCIFLUSH);
            }

            struct termios parameters;

            int get = tcgetattr(fd, &parameters);
            if(get == -1){ 
                perror("Error getting attributes");
            }
            else{ 
                printf("%s\n", "Get attributes: success");
            }

            //sets input and output baud rate
            cfsetispeed(&parameters,B115200);
            cfsetospeed(&parameters,B115200);

            // or forces values to 1; and forces all values to 0 (off); 
            parameters.c_iflag &= ~(IXON | IXOFF); //flow control off; 
            parameters.c_cflag = CS8; //8 bit character size 
            parameters.c_cflag &= PARENB;//no parity 

            //parameters.c_oflag = 
            //parameters.c_lflag = 
            parameters.c_cc[VMIN] = 1; // 1 input byte is enough to return from read()
            parameters.c_cc[VTIME] = 0;// Timer off 

            //set attribute immediately
            int set = tcsetattr(fd, TCSANOW, &parameters); 
            if(set == -1){
                perror("Error setting attributes \n");
            }
            if (fd == -1){
                perror(yungin);
            return 1;
            }   

        return fd;
    }

    //start funtion can set mode to either safe, full, or passive
    int yungBot::start(const char *mode){
        if(mode=="safe"){
             unsigned char command[]={128,131};
            if(mode=="full"){
                unsigned char command[]={128,132};
                if(mode=="passive"){
                    unsigned char command[]={128};
                    if(write(fd,command, sizeof(command))==-1){
                    perror("error starting robot");
                    return -1;
                    }
                }
            }
        }
    return 0;
    }

    yungBot::yungBot(){
    printf("Initializing the Yung... \n");
    }

    yungBot::~yungBot(){    
    printf("\nClosing the Yung... \n");
    }






    *yungBot.h:*

    #ifndef yungBot_h
    #define yungBot_h

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

    class yungBot{
        public:
            int init(const char *device);
            int readBot();
            int start(const char *mode);
            yungBot();
            ~yungBot();
            int fd; 
    };

    #endif





*main.cpp*

#include "yungBot.h"

int main(int argc, char *argv[]){
    yungBot steve0;
    steve0.fd = steve0.init("/dev/ttyUSB0");
    steve0.start("full");

    //steve0.off();
    //steve0.start();
    //steve0.safeMode();
return 0;
}

Я ожидаю, что робот включится и подаст звуковой сигнал после запуска основной функции, как объяснено в irobot create2Документация. Все компилируется нормально, я не получаю сообщений об ошибках, но робот не реагирует. Спасибо за любую помощь с этим!

...