我正在尝试实现一个从串口(Linux)读取并返回char *的函数。 该函数工作正常,但我如何存储函数的返回值。 功能的例子是
char *ReadToSerialPort()
{
char *bufptr;
char buffer[256]; // Input buffer/ /
//char *bufptr; // Current char in buffer //
int nbytes; // Number of bytes read //
bufptr = buffer;
while ((nbytes = read(fd, bufptr, buffer+sizeof(buffer)-bufptr -1 )) > 0)
{
bufptr += nbytes;
// if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
/*if ( bufptr[sizeof(buffer) -1] == '*' && bufptr[0] == '$' )
{
break;
}*/
} // while ends
if ( nbytes ) return bufptr;
else return 0;
*bufptr = '\0';
} // end ReadAdrPort
//In main
int main( int argc , char *argv[])
{
char *letter;
if(strcpy(letter, ReadToSerialPort()) >0 )
{
printf("Response is %s\n",letter);
}
}
答案 0 :(得分:5)
您应该在堆上使用malloc
分配一个缓冲区,并将其返回。您的函数的用户将负责释放内存(并且您的文档必须清楚地说明这一点!)
一个简单的改变就是
char* buffer = (char*)malloc(256);
// beware that now `sizeof(buffer)` will be not 256 any more, but 4, so
// you have to define your constant for it.
...
if (nbytes) return buffer;
free(buffer);
return 0;
...
int main(int argc, char *argv[])
{
char *letter = ReadToSerialPort();
if (letter)
{
printf("Response is %s\n", letter);
free(letter);
return 0;
}
return 1;
}
请注意,代码*bufptr = '\0';
应该在return
之前,而不是之后!
修改强>
你的代码是这样的:
char *ReadToSerialPort()
{
const int buffer_size = 256;
char *buffer = (char *)malloc(buffer_size);
char *bufptr = buffer;
int nbytes;
while ((nbytes = read(fd, bufptr, buffer+buffer_size-bufptr-1)) > 0)
{
bufptr += nbytes;
}
*bufptr = '\0';
if (bufptr != buffer)
return bufptr;
// else cleaning up
free(buffer);
return 0;
}
我很好奇fd
来自哪里?
答案 1 :(得分:0)
将主要代码修改如下:
//In main
int main( int argc , char *argv[])
{
char *letter = ReadToSerialPort();
if(letter != NULL)
{
printf("Response is %s\n",letter);
}
}
确保在static
内使用声明为ReadToSerialPort()
的缓冲区.....
即:
static char buffer[256];
答案 2 :(得分:0)
您需要更多地指定您的功能。你不能简单地说它“返回char *
”。它指向的角色在哪里?在静态缓冲区?在堆上(由new
分配)?看起来您正在尝试返回指向本地缓冲区(在堆栈上分配)的指针,这是一个错误。或者,返回std::string
。
答案 3 :(得分:0)
您应该更改 ReadToSerialPort()的签名,以便通知调用者您要返回的字节数。所以你可以这样做:
int ReadToSerialPort(char** data);
或者这个:
void ReadToSerialPort(char** data, int* num_of_bytes);
你要负责在ReadToSerialPort()中分配内存空间。
用户会做类似的事情(未经测试):
int main( int argc , char *argv[])
{
char* data = NULL;
int count = 0;
ReadToSerialPort(data, &count);
if (data != NULL && count > 0) // Let's suppose count returns as 5
{
printf("data[0]:%x data[1]:%x data[2]:%x data[3]:%x data[4]:%x\n", data[0], data[1], data[2], data[3], data[4]);
}
// and the user is responsible for deallocating data himself
free(data);
return 0;
}