将逗号分隔的字符串从浮点变量写入串口
Writing comma delimited string to serial port from floating point variables
我正在解析一个字符串,其中包含 3 个值,以逗号分隔。我目前正在为此使用 sscanf,效果很好。我想做的是在解析字符串后对这些值进行操作,并将我的结果连接回我收到的相同格式,并在每次读取和操作字符串后将其写回串行端口。我认为我 运行 遇到的问题是我在解析时将变量声明为浮点数,并且想知道如何将浮点数放回一起以写入串行端口。我也有变量实际写入缓冲区并发送出去的问题,但这是另一回事。对此的任何帮助将不胜感激。这是我所拥有的示例:
do {
struct timeval timeout = {0,299500};
char c;
fd_set fds;
int ret1, ret2;
//Zero file descriptor set, then append all types.
FD_ZERO(&fds);
FD_SET(cmp_fd, &fds);
FD_SET(STDIN_FILENO, &fds);
ret1 = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
if (ret1 == -1)
{
perror("select");
need_exit = 1;
}
else if (ret1 > 0)
{
if (FD_ISSET(cmp_fd, &fds))
{
do {ret2 = read(cmp_fd, &c, 1);}
while ((ret2 < 0 && errno == EINTR));
if (ret2 == 1)
{
data_str[cmp_ind] = c;
cmp_ind++;
if(c == '\n')
{
float press, temp, cond;
char strn;
int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);
char ppri[3]
ppri[1]= [press+1.3,temp,cond];
ppri[2] = temp;
ppri[3] = cond;
printf("%f",ppri);
write(cmp_fd,ppri,sizeof(ppri)); /* <-- This is what I am trying to do*/
/*needed output is: "#####.##,#####.##, #####.##" */
bzero(data_str,100);
cmp_ind = 0;
printf("\r\n");
}
}
else if(ret2 == -1)
{
perror("read");
need_exit = 1;
}
}
if(FD_ISSET(STDIN_FILENO, &fds))
{
do {ret2 = read(STDIN_FILENO, &c, 1);}
while (ret2 < 0 && errno == EINTR);
if(ret2 == 1)
{
if(c == '\x01') {
need_exit = -1;
}
}
}
}
}
while (!need_exit);
int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);
我认为上面你可能想用所有三个浮点变量形成一个字符串,但是,这实际上是存储 cond
浮点值转换为 strn
中的字符
char ppri[3]
ppri
是一个3个字符的数组,字面上不能存储三个浮点值转换成字符串后,除非每个浮点数都是一个整数。但是,您仍然没有 space 在其中加上三个逗号。
ppri[1]= [press+1.3,temp,cond];
这一行无论如何都不会编译,我不知道它是如何为你编译的。
ppri[2] = temp;
ppri[3] = cond;
声明了大小为 3 的字符数组,您无法访问 ppri[3]
,数组索引从 0 开始。
printf("%f",ppri);
因为ppri是一个数组,ppri存储第一个字符的地址。
write(cmp_fd,ppri,sizeof(ppri));
这将在 fd 指向的文件中写入 3 个字符。
我不确定你在这部分代码中试图做什么,这是我的初步观察,你可以看到代码中的其他错误,尝试修复它们。
但是无论如何,如果你想解析以逗号分隔的浮点数,那么你可以使用,
float f1, f2, f2;
// read float values from string,
sscanf(data_str,"%f,%f,%f",&f1,&f2,&f3);
// modify the float value
f1 += 10;
// form the modified string again.
sprintf(data_str,"%f,%f,%f",f1,f2,f3);
并写回 data_str
我正在解析一个字符串,其中包含 3 个值,以逗号分隔。我目前正在为此使用 sscanf,效果很好。我想做的是在解析字符串后对这些值进行操作,并将我的结果连接回我收到的相同格式,并在每次读取和操作字符串后将其写回串行端口。我认为我 运行 遇到的问题是我在解析时将变量声明为浮点数,并且想知道如何将浮点数放回一起以写入串行端口。我也有变量实际写入缓冲区并发送出去的问题,但这是另一回事。对此的任何帮助将不胜感激。这是我所拥有的示例:
do {
struct timeval timeout = {0,299500};
char c;
fd_set fds;
int ret1, ret2;
//Zero file descriptor set, then append all types.
FD_ZERO(&fds);
FD_SET(cmp_fd, &fds);
FD_SET(STDIN_FILENO, &fds);
ret1 = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
if (ret1 == -1)
{
perror("select");
need_exit = 1;
}
else if (ret1 > 0)
{
if (FD_ISSET(cmp_fd, &fds))
{
do {ret2 = read(cmp_fd, &c, 1);}
while ((ret2 < 0 && errno == EINTR));
if (ret2 == 1)
{
data_str[cmp_ind] = c;
cmp_ind++;
if(c == '\n')
{
float press, temp, cond;
char strn;
int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);
char ppri[3]
ppri[1]= [press+1.3,temp,cond];
ppri[2] = temp;
ppri[3] = cond;
printf("%f",ppri);
write(cmp_fd,ppri,sizeof(ppri)); /* <-- This is what I am trying to do*/
/*needed output is: "#####.##,#####.##, #####.##" */
bzero(data_str,100);
cmp_ind = 0;
printf("\r\n");
}
}
else if(ret2 == -1)
{
perror("read");
need_exit = 1;
}
}
if(FD_ISSET(STDIN_FILENO, &fds))
{
do {ret2 = read(STDIN_FILENO, &c, 1);}
while (ret2 < 0 && errno == EINTR);
if(ret2 == 1)
{
if(c == '\x01') {
need_exit = -1;
}
}
}
}
}
while (!need_exit);
int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);
我认为上面你可能想用所有三个浮点变量形成一个字符串,但是,这实际上是存储 cond
浮点值转换为 strn
char ppri[3]
ppri
是一个3个字符的数组,字面上不能存储三个浮点值转换成字符串后,除非每个浮点数都是一个整数。但是,您仍然没有 space 在其中加上三个逗号。
ppri[1]= [press+1.3,temp,cond];
这一行无论如何都不会编译,我不知道它是如何为你编译的。
ppri[2] = temp;
ppri[3] = cond;
声明了大小为 3 的字符数组,您无法访问 ppri[3]
,数组索引从 0 开始。
printf("%f",ppri);
因为ppri是一个数组,ppri存储第一个字符的地址。
write(cmp_fd,ppri,sizeof(ppri));
这将在 fd 指向的文件中写入 3 个字符。
我不确定你在这部分代码中试图做什么,这是我的初步观察,你可以看到代码中的其他错误,尝试修复它们。
但是无论如何,如果你想解析以逗号分隔的浮点数,那么你可以使用,
float f1, f2, f2;
// read float values from string,
sscanf(data_str,"%f,%f,%f",&f1,&f2,&f3);
// modify the float value
f1 += 10;
// form the modified string again.
sprintf(data_str,"%f,%f,%f",f1,f2,f3);
并写回 data_str