我正在尝试将三个参数传递给write()函数:
write(fd, "C,1,1\r\n", 7);
这很好用。但是我想获取一个参数并将其传递给命令部分以使其动态化:
write(fd, N, 4);
我不熟悉c ++类型,但它一直要求一种“const void *”我已经能够将我的变量N转换成几种不同的格式,希望转换更容易。这就是我的尝试:
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
const double N = outValue.AsLong();
double N = outValue.AsLong();
所以double和const double(*可能几乎是一样的......我不太了解c ++)
我也可以将其保留为:
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
write(fd, outValue, 4);
但是我想每个人都要问如何转换一个double会比尝试解释或找出类似const fmx :: FixPt& ...
这样独特的东西要好得多*我也尝试过:
write(fd, &N, 4);
只能摆脱我的错误,但仍无效。
那么,甚至可以转换为“const void *”的类型吗?
非常感谢!
这是代码:
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
double N = outValue.AsLong();
int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~ECHO;
options.c_oflag &= ~ECHO;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= CRTSCTS;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] =10;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&options);
if( tempText->Assign("2"), *tempText == direction ) {
write(fd, "C,1,2\r\n", 7);//Direction
}else{
write(fd, "C,1,1\r\n", 7);//Direction
}
if( tempText->Assign("1"), *tempText == speed ) {
write(fd, "C,2,1\r\n", 7);//Speed
} else if( tempText->Assign("2"), *tempText == speed ) {
write(fd, "C,2,2\r\n", 7);//Speed
} else if( tempText->Assign("3"), *tempText == speed ) {
write(fd, "C,2,3\r\n", 7);//Speed
} else if( tempText->Assign("4"), *tempText == speed ) {
write(fd, "C,2,4\r\n", 7);//Speed
} else if( tempText->Assign("5"), *tempText == speed ) {
write(fd, "C,2,5\r\n", 7);//Speed
} else if( tempText->Assign("6"), *tempText == speed ) {
write(fd, "C,2,6\r\n", 7);//Speed
} else if( tempText->Assign("7"), *tempText == speed ) {
write(fd, "C,2,7\r\n", 7);//Speed
} else if( tempText->Assign("8"), *tempText == speed ) {
write(fd, "C,2,8\r\n", 7);//Speed
} else if( tempText->Assign("9"), *tempText == speed ) {
write(fd, "C,2,9\r\n", 7);//Speed
} else if( tempText->Assign("10"), *tempText == speed ) {
write(fd, "C,2,10\r\n", 8);//Speed
} else if( tempText->Assign("11"), *tempText == speed ) {
write(fd, "C,2,11\r\n", 8);//Speed
} else if( tempText->Assign("12"), *tempText == speed ) {
write(fd, "C,2,12\r\n", 8);//Speed
} else if( tempText->Assign("13"), *tempText == speed ) {
write(fd, "C,2,13\r\n", 8);//Speed
} else if( tempText->Assign("14"), *tempText == speed ) {
write(fd, "C,2,14\r\n", 8);//Speed
} else if( tempText->Assign("15"), *tempText == speed ) {
write(fd, "C,2,15\r\n", 8);//Speed
} else if( tempText->Assign("16"), *tempText == speed ) {
write(fd, "C,2,16\r\n", 8);//Speed
} else if( tempText->Assign("17"), *tempText == speed ) {
write(fd, "C,2,17\r\n", 8);//Speed
}
if(tempText->Assign("1"), *tempText == length){
write(fd, "C,3,", 4);
write(fd, "1", 1);
write(fd, "\r\n", 2);
} else if(tempText->Assign("2"), *tempText == length){
write(fd, "C,3,", 4);
write(fd, "10", 2);
write(fd, "\r\n", 2);
} else if(tempText->Assign("3"), *tempText == length){
write(fd, "C,3,", 4);
write(fd, "100", 3);
write(fd, "\r\n", 2);
} else if(tempText->Assign("4"), *tempText == length){
write(fd, "C,3,", 4);
write(fd, N, 4);
write(fd, "\r\n", 2);
}
close(fd);
错误:无法将参数'2'的'double'转换为'const void *'为'ssize_t write(int,const void *,size_t)'
答案 0 :(得分:7)
write
命令只占用一大块数据并写入文件描述符。因此,如果您想编写double
中保存的二进制数据,您可以执行以下操作:
write(fd, &N, sizeof(double));
请注意,这会将二进制数据而不是人类可读的 ASCII 数据写入文件描述符。这可能很危险,因为数据存储在本地架构的字节顺序中,但根据您的应用程序,这可能不是一个问题。
通常,在C ++中,您将使用iostream
运算符:
double N = 0.0;
// write data to file
ofstream out("myfile", ofstream::binary);
out << N;
out.close();
// read data back
ifstream in("myfile", ifstream::binary);
in >> N;
in.close();
流运算符被重载以获取多种参数,包括字符串:
out << "hello world: " << 42 << endl;
答案 1 :(得分:1)
write()
函数的第二个参数是指向缓冲区(字节数组)的指针,第三个参数是该缓冲区的大小。因此,您需要以某种方式获取要写入该文件的字节数组。
你的“解决方案”
write(fd, &N, 4);
如果N是4字节长的话,将起作用。但是,似乎这不是你想要的。
从你的问题中不清楚你要完成的是什么。你想写一个字符串吗?然后,您需要将N转换为字符串,并将该字符串的第一个字节的地址传递给write
。
答案 2 :(得分:1)
在我看来,问题是从双字符串转换为字符串。我认为,如果N的值为2000,你想要写出字符'2','0','0'和'0',而不是2000.0的内部表示。
实际上,我看到你使用函数outValue.AsLong()
,我希望它返回long
值(这是一个整数)而不是double
值(浮点数) ),在这种情况下处理整数会更方便。在这种情况下,double
和long
是数据类型。
在C中将数字转换为字符串有点尴尬,通常使用sprintf()
函数完成。这有点棘手。首先,您必须指定一个char数组来将字符串写入。确保它足够大,以满足您将拥有的最大数量,并添加一个因为sprintf()
再写一个字符来标记字符串的结尾。 (大多数C字符串函数都可以。)然后用它调用sprintf
。我们来看看吧。
char string_value[5]; /* we're assuming the number is always between 0 and 9999 */
long long_value = outValue.asLong();
sprintf(string_value, "%04ld", long_value);
write (fd, string_value, 4);
要解释其中的一些内容:我们为string_value
使用了5个字符,因为我们需要字符数加1.我们将值转换为long_value
,然后使用sprintf()
函数将值放入string_value。 sprintf()
的第一个参数是结果所在的内存区域,第二个参数是格式字符串,以下是您放入字符串的值。在格式字符串中,'%'表示它将描述一个字段,'0'表示对结果进行零填充,'4'表示使用至少四个字符,而“ld”表示你是传递long
值。
答案 3 :(得分:0)
从你的工作示例来看,write看起来像一个const char *作为它的第二个参数,并且长度(const char *中的字符数)作为第三个。
所以write(fd, "C,1,1\r\n", 7);
正在传递一个const char *,它指向“C,1,1 \ r \ n”,长度为7个字符。
如果要传入变量而不是硬编码的“C,1,1 \ r \ n”,那么您需要执行以下操作:
int someNum = 7; // example variable
const int BUFFERSIZE = 256;
char strBuffer[BUFFERSIZE];
snprintf( strBuffer, BUFFERSIZE, "whatever you like, even a number: %d\n\r", someNum );
write( fd, str, BUFFERSIZE );