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)
您可能还需要在这里显示使用您的函数的代码。你还需要调试你的代码吗?怎么了 ? – nos
问题是我可以正确地发送256字节到arduino,但不能从arduino收到完整的256字节(我只收到1字节)。 我用minicom来测试我的arduino代码,并且可以读取和接收完整的256字节数据。 –
没错 - 但我们不能说这个代码有什么问题 - 它看起来很好。所以你应该自己在调试器中运行它,看看发生了什么(它是否在read()调用中阻塞?是否有任何东西给你一个错误?接收1个字节后会发生什么?等等)。或者可能存在代码中的错误,它会调用您在此处发布的函数。 – nos