C++ C+中串行通信的奇怪行为+;
我用C语言编写了用于USB通信的代码,所有代码都在没有问题的情况下运行。现在我想在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" /*******************************************
#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)