LibSerial C++ Code не работает без Cutecom

Я пытаюсь связаться через последовательный порт от Ubuntu 12.04 на плате ATxmega, используя libserial. У меня проблема в том, что мой код не запускается, если я сначала не запускаю cutecom. Если я сначала не запустил cutecom, моя программа просто зависает и ничего не выводит. Я пробовал несколько вещей, таких как предоставление sudo доступа к ttyUSB0, добавление моего пользователя в диалоговую группу. Запуск как су. Я также попытался добавить VTime и VMin, но тоже не повезло. Вот мой код, который программа не оставляет, похоже, он никогда не входит в цикл while(ros::ok()). Я использую ros, но это не должно иметь никакого эффекта здесь. Я пытаюсь общаться с доской с точностью до 1/10 секунды.

#include "ros/ros.h"

#include <SerialStream.h>
#include <iostream>
#include <math.h>

using namespace LibSerial;

SerialStream mySerial;

void processSonar(char read[]);
char motor[] = {'s','3','6','0','0'};
unsigned int writeServo = 3600;

int main(int argc, char ** argv) 
{
    ros::init(argc, argv, "mySerial");
    ros::NodeHandle n;
    std::string serial = "/dev/ttyUSB0";
    mySerial.Open(serial);  
    mySerial.SetBaudRate( SerialStreamBuf::BAUD_57600 );
    mySerial.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 );
    mySerial.SetNumOfStopBits( 1 );
    mySerial.SetParity( SerialStreamBuf::PARITY_NONE );
    mySerial.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE );
    mySerial.SetVTime( 1 );
    mySerial.SetVMin( 60 );

    while(!mySerial.IsOpen()){
        mySerial.Open(serial);  
        std::cout << "trying to open port" << std::endl;
        usleep(100000);
    }

//      if(!mySerial.good()){
//      std::cerr   << "Serial not Good"
//              << std::endl;
//      exit(1);
//      }

    char read[12];
    char* SerialP = read;
    char* motorP = motor;

    while(ros::ok())
    {
        mySerial.write(motorP, sizeof(motor));

        if(mySerial.rdbuf()->in_avail() > 0)
        {
            mySerial.read(SerialP, sizeof(read));
            std::cout << read << std::endl;
            processSonar(read);
            //std::cout << motor << writeServo << std::endl;
        }

        usleep(100000);
    }

    std::cout << "Communication Failure"<< std::endl;
    return 0;
}

1 ответ

Догадаться. Это не совсем мой код. Было то, что почему-то модем-менеджер был в пути. Мне пришлось sudo apt-get remove modemmanager а затем просто дайте мне постоянное разрешение на дозвон группы по sudo usermod -a -G dialout $USER, Перезагрузка и работает как шарм. Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам