2015-10-27 6 views
3

Я могу открыть последовательный порт, но я не могу правильно настроить этот порт для записи (/ dev/ttyUSB0).Не удалось настроить устройство ttyUSB0 (Arduino) на Ubuntu, C++

Кусок кода C++:

int 
Platform::initConnection(const char* devicePath, int baudRate) 
{ 
     int fd = 0; 
     int ret = 0; 

     struct termios terminalOptions;   // POSIX structure for configurating terminal devices 

     fd = open(devicePath, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 
     //fd = open(devicePath, O_RDWR | O_NOCTTY); 
     if (fd == -1) 
     { 
       this->setFail(); 
       this->setErrorStr("Failed to open: " + (std::string)devicePath + ". " + (std::string)strerror(errno)); 

       return -1; 
     } 

     memset(&terminalOptions, 0, sizeof(struct termios));  // Cleaning up the structure 
     cfmakeraw(&terminalOptions);         // 

     cfsetspeed(&terminalOptions, baudRate); 

     /*terminalOptions.c_cflag = CLOCAL;  // If CLOCAL is set, the line behaves as if DCD is always asserted. 
               // It is used when your device is local 

     terminalOptions.c_cflag |= CS8;   // Character size mask 

     terminalOptions.c_cc[VMIN] = 24;   // 1 second timeout 
     terminalOptions.c_cc[VTIME] = 0;  // */ 

     terminalOptions.c_cflag &= ~CRTSCTS;  
     terminalOptions.c_cflag |= (CLOCAL | CREAD);     
     terminalOptions.c_iflag |= (IGNPAR | IGNCR);     
     terminalOptions.c_iflag &= ~(IXON | IXOFF | IXANY);   
     terminalOptions.c_oflag &= ~OPOST; 

     terminalOptions.c_cflag &= ~CSIZE;    
     terminalOptions.c_cflag |= CS8;    
     terminalOptions.c_cflag &= ~PARENB;   
     terminalOptions.c_iflag &= ~INPCK;   
     terminalOptions.c_iflag &= ~(ICRNL|IGNCR); 
     terminalOptions.c_cflag &= ~CSTOPB;  
     terminalOptions.c_iflag |= INPCK;  
     terminalOptions.c_cc[VTIME] = 0.001; // 1s=10 0.1s=1 * 
     terminalOptions.c_cc[VMIN] = 0; 


     ret = ioctl(fd, TIOCSETA, &terminalOptions); // Configuring the device 
     if (ret == -1) 
     { 
       this->setFail(); 
       this->setErrorStr("Failed to configure device: " + (std::string)devicePath + ". " + (std::string)strerror(errno)); 

       return -1; 
     } 

     return fd; 
} 

Ошибка:

Failed to configure device: /dev/ttyUSB0. Inappropriate ioctl for device

Arduino UNO использует чипсет CH340.

Я понятия не имею, как решить эту проблему. Я надеюсь на вашу помощь. Благодаря!

Обновление: Вход с dmesg

[11840.346071] usb 2-1.2: new full-speed USB device number 5 using ehci-pci 
[11840.439832] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=7523 
[11840.439844] usb 2-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0 
[11840.439850] usb 2-1.2: Product: USB2.0-Serial 
[11840.440472] ch341 2-1.2:1.0: ch341-uart converter detected 
[11840.442452] usb 2-1.2: ch341-uart converter now attached to ttyUSB0 
+0

Вы установили Arduino от Ubuntu репозиториев? –

+1

выполните dmesg после подключения вашего arduino UNO и добавьте этот журнал в свой вопрос. –

+0

Если вы решили проблему другим способом, отправьте обходное решение в качестве ответа. –

ответ

1

Спасибо всем. Я нашел решение самостоятельно:

  1. Как автосброс на последовательном соединении активируется по умолчанию на большинстве плат, необходимо отключить эту функцию, если вы хотите, чтобы напрямую общаться с доской с последней командой вместо терминала эмулятор (arduino IDE, экран, пикоком ...). Если у вас есть плата Leonardo, вас это не беспокоит, потому что она не авторесеет. Если у вас есть плата Uno, подключите конденсатор 10 мкФ между контактами RESET и GND. Если у вас есть другая плата, подключите резистор 120 Ом между контактами RESET и 5V. См. http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection для более подробной информации.
  2. Сhanged код

    memset(&terminalOptions, 0, sizeof(struct termios)); 
    tcgetattr(fd, &terminalOptions);  //change 
    cfmakeraw(&terminalOptions); 
    cfsetspeed(&terminalOptions, baudRate); 
    terminalOptions.c_cflag = CLOCAL;            
    terminalOptions.c_cflag |= CS8;   
    terminalOptions.c_cc[VMIN] = 0;   
    terminalOptions.c_cc[VTIME] = 10;  
    terminalOptions.c_cflag = CLOCAL;            
    terminalOptions.c_cflag &= ~HUPCL;  //change (disable hang-up-on-close to avoid reset) 
    
    ret = tcsetattr(fd, TCSANOW, &terminalOptions); //change 
    if (ret == -1) 
    { 
         this->setFail(); 
         this->setErrorStr("Failed to configure device: " + (std::string)devicePath + ". " + (std::string)strerror(errno)); 
    
         return -1; 
    } 
    
    return fd; 
    
0

У меня также есть Arduino UNO и когда я подключить его через USB порт он подключается к/DEV/не ttyACM0 ttyUSB0 вы должны также проверить ttyACM0 при подключении и отключении вашего arduino UNO.

Это также случай Если вы не установили драйвера Arduino Порт

+0

Спасибо за ваш ответ. Однако моя тестовая программа правильно подключена к порту/dev/ttyUSB0 –

 Смежные вопросы

  • Нет связанных вопросов^_^