unix — не удалось настроить устройство ttyUSB0 (Arduino) в Ubuntu, переполнение стека

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

Кусок кода 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;
}

Ошибка:

Не удалось настроить устройство: / dev / ttyUSB0. Неподходящий ioctl для устройства

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

3

Решение

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

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

    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;
    
1

Другие решения

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

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

0

По вопросам рекламы [email protected]