将逗号分隔的字符串从浮点变量写入串口

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