无法在Ubuntu,C ++上配置设备ttyUSB0(Arduino)

时间:2015-10-27 16:21:25

标签: c++ unix arduino port termios

我可以打开串口,但我无法正确配置此端口进行写入(/ 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

2 个答案:

答案 0 :(得分:1)

感谢所有人。我自己找到了解决方案:

  1. 由于在大多数主板上默认激活串行连接上的自动复位,如果要使用最后一个命令直接与电路板通信而不是终端仿真器(arduino IDE,屏幕,picocom ......),则需要禁用此功能。 )。如果你有一个莱昂纳多板,你不关心这个,因为它没有自动复位。如果您有Uno板,请在RESET和GND引脚之间连接一个10μF电容。如果你有另一块板,在RESET和5V引脚之间连接一个120欧姆的电阻。有关详细信息,请参阅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;
    

答案 1 :(得分:0)

我也有arduino UNO,当我通过USB端口插入它连接到/ dev / ttyACM0而不是ttyUSB0时,你应该在插入和拔出你的arduino UNO时检查ttyACM0。

如果您还没有安装arduino端口驱动程序

,情况也是如此