C++ read()未返回指定的字节数

C++ read()未返回指定的字节数,c++,linux,C++,Linux,我正在使用read()函数读取传感器数据(在RS232上广播)。数据速率为264字节/秒 我使用以下代码读取数据(我只需要读取60个字节) int-BytesToRead=60; unsigned char*iBuffer=新的unsigned char[BytesToRead]; int ret=读取(COM、iBuffer、BytesToRead); coutread()不保证返回请求的字节数: 从阅读(2)Linux手册页: 成功时,返回读取的字节数(零表示文件结束),文件位置按此数字前进

我正在使用read()函数读取传感器数据(在RS232上广播)。数据速率为264字节/秒

我使用以下代码读取数据(我只需要读取60个字节)

int-BytesToRead=60;
unsigned char*iBuffer=新的unsigned char[BytesToRead];
int ret=读取(COM、iBuffer、BytesToRead);
cout
read()
不保证返回请求的字节数:

阅读(2)
Linux手册页:

成功时,返回读取的字节数(零表示文件结束),文件位置按此数字前进。如果该数字小于请求的字节数,则不是错误;例如,这可能是因为现在实际可用的字节更少(可能是因为我们快到文件末尾了,或者是因为我们正在从管道或终端读取),或者是因为read()被信号中断。在出现错误时,返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否更改

read()
不保证返回请求的字节数:

阅读(2)
Linux手册页:

成功时,返回读取的字节数(零表示文件结束),文件位置按此数字前进。如果该数字小于请求的字节数,则不是错误;例如,这可能是因为现在实际可用的字节更少(可能是因为我们快到文件末尾了,或者是因为我们正在从管道或终端读取),或者是因为read()被信号中断。在出现错误时,返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否更改


我假设这是一个Linux系统。。。。 您的BytesToRead变量只是对read()的建议,因为read()将尝试读取BytesToRead。如果read()返回的字节数小于请求的字节数,则可读取的字节数将减少。 从linux手册页上读取

。。。如果该数字小于请求的字节数,则不是错误;例如,这可能是因为现在实际可用的字节更少(可能是因为我们快到文件末尾了,或者是因为我们正在从管道或终端读取),或者是因为read()被信号中断


可能是您的传感器没有发送您期望的数据,或者您没有给它足够的时间来传输所有数据,或者您的代码示例中没有明显的其他逻辑/硬件问题。

我假设这是一个Linux系统。。。。 您的BytesToRead变量只是对read()的建议,因为read()将尝试读取BytesToRead。如果read()返回的字节数小于请求的字节数,则可读取的字节数将减少。 从linux手册页上读取

。。。如果该数字小于请求的字节数,则不是错误;例如,这可能是因为现在实际可用的字节更少(可能是因为我们快到文件末尾了,或者是因为我们正在从管道或终端读取),或者是因为read()被信号中断


可能是您的传感器没有发送您期望的数据,或者您没有给它足够的时间传输所有数据,或者代码示例中没有明显的其他逻辑/硬件问题。

-如果我没有弄错,read()不必返回所有请求的字节,因此,如果它返回的值小于您需要的值,您需要再次调用它。或者将调用设为链接中的阻塞,以便read等待所有字节可用。另外,第三个参数是size\u t,而不是intAlso-post如何构造
COM
对象。正如stijn指出的,read(…)的第三个参数应该是size_t(无符号整数类型),而不是int。当你说“随机字节”时,你的意思是得到30个有意义的字节,30个坏字节?或者你只得到30个字节的垃圾?@stijn:将
BytesToRead
a
size\t
作为一种更好的样式,但将其设置为
int
并不是一个错误。参数被隐式转换为正确的类型,并且只要字节数不超过
INT\u MAX
(至少32767),使用
INT
不会导致任何实际问题。我通过更改read()的第三个参数来尝试。但是,它仍然是一样的。@非常感谢[它解决了]第一个循环,我向电子设备发送了一个设置采样率的命令。所以有一个随机字节传输。但是,如果我等待一段时间(几毫秒),函数将返回请求的正确字节数。-如果我没弄错的话,read()并没有义务返回所有请求的字节,所以如果它返回的字节数少于您需要的字节数,您需要再次调用它。或者将调用设为链接中的阻塞,以便read等待所有字节可用。另外,第三个参数是size\u t,而不是intAlso-post如何构造
COM
对象。正如stijn指出的,read(…)的第三个参数应该是size_t(无符号整数类型),而不是int。当你说“随机字节”时,你的意思是得到30个有意义的字节,30个坏字节?或者你只得到30个字节的垃圾?@stijn:将
BytesToRead
a
size\t
作为一种更好的样式,但将其设置为
int
并不是一个错误。参数被隐式转换为正确的类型,并且只要字节数不超过
INT\u MAX
(至少32767),使用
INT
不会导致任何实际问题。我通过更改read()的第三个参数来尝试。但是,它仍然是一样的。@非常感谢[它解决了]第一个循环,我向电子设备发送了一个设置采样率的命令。所以有一个随机字节传输。但是,如果我等一会儿
int BytesToRead = 60;
unsigned char* iBuffer = new unsigned char[BytesToRead];
int ret = read(COM, iBuffer, BytesToRead);

cout<<ret<<endl;    

if (ret == 0) {
cout<<"Error Reading COM Port"<<endl;
exit(EXIT_FAILURE);         // Error Handling
} 
delete[] iBufer;
int Connect(const char *DeviceName){

long BAUD = B115200;
long DATABITS = CS8;            // CS8 = 8n1 Config.(8 bits, No parity, 1 Stop Bit)
long VMIN_CC = 1;           // 1 input byte is enough to return from read()
long VTIME_CC = 0;          // Inter-character timer
long STOPBITS = 0;          // Defined with CS8
long PARITYON = 0;          // NONE (Ref.: IH2 Azzura Hand User Guide)
long PARITY = 0;            // NONE (Ref.: IH2 Azzura Hand User Guide)


struct termios config;          // Configuration of the termios structure
fd_set rdset;               // File discription set

//Basic serial interface configuration  
//iflag = Input flag || oflag = Output flag || lflag = No-line processing flag
//c_cflag = Caracter processing flag || c_cc = Special character flag

memset(&config,0,sizeof(config));
config.c_iflag = 0;             // Turning OFF Input processing
config.c_oflag = 0;             // Turning OFF Output processing
config.c_lflag = 0; 
config.c_cflag = DATABITS |CREAD|CLOCAL;// Enable the receiver and set local mode
config.c_cc[VMIN] = VMIN_CC;        
config.c_cc[VTIME] = VTIME_CC;      

//Opening the Port for communication
int com = open(DeviceName, O_RDWR | O_NOCTTY);

//Error Handling    
if (com < 0) {
cout<<"ERROR!! Opening Port \n"<<"Sys:"<<strerror(errno)<<endl;
exit(EXIT_FAILURE);
} else {cout<<"Serial Communication (Opening Port): "<<strerror(errno)<<endl;}

//Setting the BaudRate for Communcation
cfsetispeed(&config, BAUD);
cfsetospeed(&config, BAUD);

//Applying Configuration / Attributes
int Attr = tcsetattr(com, TCSANOW, &config);

//Error Handling
if(Attr < 0){
    cout<<"ERROR!! Setting Attributes \n"<<"Sys:"<< strerror(errno)<<endl;
    exit(EXIT_FAILURE);
    } else {cout<<"Serial Communication (Setting Attributes): "<<strerror(errno)<<endl;}

return(com);