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

时间:2015-02-11 16:35:53

标签: c string floating-point serial-port concatenation

我正在解析一个包含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);

1 个答案:

答案 0 :(得分:0)

int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);

我想上面你可能想要形成一个包含所有三个float变量的字符串,但实际上这是将cond float值转换为strn

中的字符
char ppri[3]

ppri是一个包含3个字符的数组,除非每个float都是单个数字整数,否则在将它们转换为字符串后,实际上不能存储三个浮点值。但是,你也没有空间可以放三个逗号。

ppri[1]= [press+1.3,temp,cond];

这一行不会不惜任何代价编译,我不知道它是如何编译的。

ppri[2] = temp;
ppri[3] = cond;

声明了大小为3的char数组,你无法访问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