Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中串行通信的奇怪行为+;_C++_Usb_Communication - Fatal编程技术网

C++ C+中串行通信的奇怪行为+;

C++ C+中串行通信的奇怪行为+;,c++,usb,communication,C++,Usb,Communication,我用C语言编写了用于USB通信的代码,所有代码都在没有问题的情况下运行。现在我想在C++中移植代码,但是当我编译并运行它时,输出非常奇怪,通信无法启动。我真的不明白原因。有人能帮我吗? 以下是我的主要代码: #include <unistd.h> #include <arpa/inet.h> #include <errno.h> #include "UARTcom.h" /*******************************************

我用C语言编写了用于USB通信的代码,所有代码都在没有问题的情况下运行。现在我想在C++中移植代码,但是当我编译并运行它时,输出非常奇怪,通信无法启动。我真的不明白原因。有人能帮我吗? 以下是我的主要代码:

#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include "UARTcom.h"

/**********************************************************
 *DEFINES
 **********************************************************/

// Define controll marker for serial transmission
#define SOH 0x01
#define STX 0x02
#define ETX 0x03

// Define dimensions
#define COMMAND_SIZE 16
#define DATA_SIZE 21

// Define imu data structure
typedef struct
{
  signed short x;
  signed short y;
  signed short z;
}
  data_sensor;

typedef struct
{
  data_sensor acc;
  data_sensor gyr;
  data_sensor mag;
}
  imu_data;

/**********************************************************
 *GLOBAL VARIABLES
 **********************************************************/

// Define global variables shared between process
int tcp_port, frame_ready, imu_ready;
char* serial_device;

/**********************************************************
 *FUNCTIONS DECLARATION
 **********************************************************/

void check_arg(int, char**);

int main(int argc, char **argv)
{
  imu_ready = 0;

  // Arguments controll and set tcp_port/serial_device variables
  check_arg(argc,argv);

  unsigned char command[COMMAND_SIZE];
  command[0] = SOH;
  command[1] = STX;
  command[3] = 0x80;
  command[15] = ETX;

  unsigned char temp_imu_data[DATA_SIZE];
  imu_data imu_xyz_data;
  memset(temp_imu_data, 0, sizeof(temp_imu_data));
  memset(&imu_xyz_data, 0, sizeof(imu_xyz_data));

  // Setup serial communication
  UARTcom *serial = new UARTcom(argv[2]);

  std::cout<<"=== SERIAL USB ==="<<std::endl;

  while(1)
    {
      if(command[0]==SOH && command[1]==STX && command[COMMAND_SIZE-1]==ETX)
        {
          if(serial->sendData(command, COMMAND_SIZE) < 0)
            {
              std::cout<<"controller(): Failed to send command to controller"<<std::endl;
            }
        }
          else
        {
          std::cout<<"controller(): Command to send corrupted"<<std::endl;
        }

      usleep(1000);

      if(serial->receiveData(temp_imu_data, DATA_SIZE) < 0)
    {
      std::cout<<"controller(): Failed to receive IMU data"<<std::endl;
    }

      usleep(1000);

      if(temp_imu_data[0]==SOH && temp_imu_data[1]==STX && temp_imu_data[DATA_SIZE-1]==ETX)
    {
      imu_xyz_data.acc.x = htons((short)(temp_imu_data[3] << 8) | temp_imu_data[2]);
      imu_xyz_data.acc.y = htons((short)(temp_imu_data[5] << 8) | temp_imu_data[4]);
      imu_xyz_data.acc.z = htons((short)(temp_imu_data[7] << 8) | temp_imu_data[6]);
      imu_xyz_data.gyr.x = htons((short)(temp_imu_data[9] << 8) | temp_imu_data[8]);
      imu_xyz_data.gyr.y = htons((short)(temp_imu_data[11] << 8) | temp_imu_data[10]);
      imu_xyz_data.gyr.z = htons((short)(temp_imu_data[13] << 8) | temp_imu_data[12]);
      imu_xyz_data.mag.x = htons((short)(temp_imu_data[15] << 8) | temp_imu_data[14]);
      imu_xyz_data.mag.y = htons((short)(temp_imu_data[17] << 8) | temp_imu_data[16]);
      imu_xyz_data.mag.z = htons((short)(temp_imu_data[19] << 8) | temp_imu_data[18]);

      std::cout<<"  "<<imu_xyz_data.acc.x<<"  "<<imu_xyz_data.acc.y<<"  "<<imu_xyz_data.acc.z<<std::endl;
      std::cout<<"  "<<imu_xyz_data.gyr.x<<"  "<<imu_xyz_data.gyr.y<<"  "<<imu_xyz_data.gyr.z<<std::endl;
      std::cout<<"  "<<imu_xyz_data.mag.x<<"  "<<imu_xyz_data.mag.y<<"  "<<imu_xyz_data.mag.z<<std::endl;
    }
      else
    {
      std::cout<<"controller(): IMU data corrupted"<<std::endl;
    }
    }
}
这个程序除了不能启动通讯外,还会冻结并迫使我杀死它


有人能解释一下原因吗?

问题在于以下代码:

if(serialFD = open(serialdevice, O_RDWR | O_NDELAY) < 0)
不过,我建议将其分为两行,以便更具可读性:

serialFD = open(serialdevice, O_RDWR | O_NDELAY);
if(serialFD < 0) 
serialFD=open(serialdevice,O|RDWR | O|NDELAY);
if(serialFD<0)
odroid@odroid:~/NistaGlass/SERIALE$ ./NGC1_SER 8080 /dev/ttyUSB0
UARTcom(): Serial port open on /dev/ttyUSB0
                                           === SERIAL USB ===
                                                             ����o�Killed
if(serialFD = open(serialdevice, O_RDWR | O_NDELAY) < 0)
if((serialFD = open(serialdevice, O_RDWR | O_NDELAY)) < 0)
serialFD = open(serialdevice, O_RDWR | O_NDELAY);
if(serialFD < 0)