2016-03-04 59 views
1

我的Linux C應用程序不能從Arduino的我的Linux C程序不能從Arduino的通過USB接收數據串行

大家好接收字節,我打算將使用Arduino兆2560作爲AT89S52(家庭8051微處理器的)程序員。 Arduino板通過USB串行電纜連接到PC。

起初我需要在我的Ubuntu中編寫一個程序來與Arduino板進行通信。我的程序可以打開連接並正確寫入字節到Arduino(我通過打開/關閉來測試),但問題是Linux程序無法從Arduino接收數據。 我已經搜遍了很多教程和論壇,但仍然無法解決問題,所以我在這裏發佈問題,並希望有人能幫助我。

  • 下面是用我的functon打開連接到設備

    AT89S_EID usbserial_open (char* dev_name, 
               UsbSerialDevice* dev_ptr, 
               int baudrate, 
               int config) { 
    speed_t io_baudrate = B9600; 
    
    if (dev_name == NULL || dev_ptr == NULL) 
    { 
        return AT89S_EID_ARG_NULL; 
    } 
    
    if (baudrate != US_BAUDRATE_9600 
        && baudrate != US_BAUDRATE_19200 
        && baudrate != US_BAUDRATE_115200) 
    { 
        return AT89S_EID_SERIAL_BAUDRATE_INVALID; 
    } 
    if (config != US_CONFIG_8N1 
        && config != US_CONFIG_7E1 
        && config != US_CONFIG_7O1) 
    { 
        return AT89S_EID_SERIAL_CONFIG_INVALID; 
    } 
    
    // store device name 
    strcpy(dev_ptr->name, dev_name); 
    
    // open device 
    dev_ptr->fd = open (dev_ptr->name, 
            O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); 
    if (dev_ptr->fd < 0) 
    { 
        return AT89S_EID_SERIAL_OPEN; 
    } 
    
    // get current termios settings 
    if (tcgetattr(dev_ptr->fd, &dev_ptr->tios) < 0) 
    { 
        return AT89S_EID_SERIAL_GET_ATTR; 
    } 
    
    // set input/output baudrdate 
    if (baudrate == US_BAUDRATE_9600) 
        io_baudrate = B9600; 
    else if (baudrate == US_BAUDRATE_19200) 
        io_baudrate = B19200; 
    else if (baudrate == US_BAUDRATE_115200) 
        io_baudrate = B115200; 
    
    if (cfsetispeed(&dev_ptr->tios, io_baudrate) != 0 
        || cfsetospeed(&dev_ptr->tios, io_baudrate) != 0) 
    { 
        return AT89S_EID_SERIAL_SET_IOSPEED; 
    } 
    
    // enable receiver, ignore status line 
    dev_ptr->tios.c_cflag |= (CREAD | CLOCAL); 
    // set config 
    if (config == US_CONFIG_8N1) 
    { 
        dev_ptr->tios.c_cflag &= ~PARENB; 
        dev_ptr->tios.c_cflag &= ~CSTOPB; 
        dev_ptr->tios.c_cflag &= ~CSIZE; 
        dev_ptr->tios.c_cflag |= CS8; 
    } 
    else if (config == US_CONFIG_7E1) 
    { 
        dev_ptr->tios.c_cflag |= PARENB; 
        dev_ptr->tios.c_cflag &= ~PARODD; 
        dev_ptr->tios.c_cflag &= ~CSTOPB; 
        dev_ptr->tios.c_cflag &= ~CSIZE; 
        dev_ptr->tios.c_cflag |= CS7; 
    } 
    else if (config == US_CONFIG_7O1) 
    { 
        dev_ptr->tios.c_cflag |= PARENB; 
        dev_ptr->tios.c_cflag |= PARODD; 
        dev_ptr->tios.c_cflag &= ~CSTOPB; 
        dev_ptr->tios.c_cflag &= ~CSIZE; 
        dev_ptr->tios.c_cflag |= CS7; 
    } 
    
    // no HW flow control 
    dev_ptr->tios.c_cflag &= ~CRTSCTS; 
    
    // no input processing (raw input) 
    dev_ptr->tios.c_iflag &= ~(IXON | IXOFF | IXANY); 
    // other input settings 
    dev_ptr->tios.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
    
    // no output processing (raw output) 
    dev_ptr->tios.c_oflag &= ~OPOST; 
    
    // control character settings 
    dev_ptr->tios.c_cc[VMIN] = 1; // wait for 1 minimum chacacter received 
    dev_ptr->tios.c_cc[VTIME] = 0; // no timeout when waiting for charater 
    
    // commit new settings 
    if (tcsetattr(dev_ptr->fd, TCSANOW, &dev_ptr->tios) < 0) 
    { 
        return AT89S_EID_SERIAL_SET_ATTR; 
    } 
    
    // wait for device reset & sync up 
    usleep(1500 * 1000); 
    return AT89S_EID_OK; 
    } /* usbserial_open */ 
    
  • 這是接收功能:

    AT89S_EID usbserial_recv (UsbSerialDevice* dev_ptr, 
               unsigned char* data_ptr, 
               int data_len) { 
    int read_byte = 0; 
    char b[1]; 
    
    if (dev_ptr == NULL 
        || data_ptr == NULL) 
    { 
        return AT89S_EID_ARG_NULL; 
    } 
    
    // block reading 
    fcntl(dev_ptr->fd, F_SETFL, 0); 
    
    // start receiving data 
    while (read_byte < data_len) 
    { 
        if (read(dev_ptr->fd, b, 1) > 0) 
        { 
         data_ptr[read_byte++] = *b; 
        } 
        else 
        { 
         if (errno == EAGAIN) 
          continue; 
         else if (errno == ETIMEDOUT) 
          break; 
         else 
          return AT89S_EID_SERIAL_RECV; 
        } 
    } 
    
    return AT89S_EID_OK; 
    } /* usbserial_recv */ 
    

很抱歉張貼長碼: )

I alrea dy通過許多教程和論壇進行搜索,但仍無法解決問題。我相信Arduino代碼工作正常,因爲我使用了其他工具來測試它(例如:minicom)

+0

您可能還需要在這裏顯示使用您的函數的代碼。你還需要調試你的代碼嗎?怎麼了 ? – nos

+0

問題是我可以正確地發送256字節到arduino,但不能從arduino收到完整的256字節(我只收到1字節)。 我用minicom來測試我的arduino代碼,並且可以讀取和接收完整的256字節數據。 –

+0

沒錯 - 但我們不能說這個代碼有什麼問題 - 它看起來很好。所以你應該自己在調試器中運行它,看看發生了什麼(它是否在read()調用中阻塞?是否有任何東西給你一個錯誤?接收1個字節後會發生什麼?等等)。或者可能存在代碼中的錯誤,它會調用您在此處發佈的函數。 – nos

回答

0

我解決了我的問題。打開連接到設備時只需添加刷新功能,一切都可以正常工作。

tcflush(fd, TCIOFLUSH); 
相關問題