如何将chars从串口读入缓冲区进行处理?

时间:2014-07-25 10:39:48

标签: c turbo-c++

现在我有一些代码打印出从putch(out)的串行端口读取的数据。但是我需要将它存储到一个数组中并处理它以获得浮点值。

这是我的代码,仅用于与串口通信,省略了计算:

#include <bios.h>
#include <conio.h>

#define COM1       0
#define DATA_READY 0x100

// set the baud rate, parity bit, data width...
#define SETTINGS ( 0xE0 | 0x03 | 0x00 | 0x00)

int main(void)
{
    int in, out, status,i;
    char dataRead[21];
    float roll, pitch;
    bioscom(0, SETTINGS, COM1); /*initialize the port*/
    clrscr();
    cprintf("Data sent to you:  ");    

    while (1) 
    { 
        status = bioscom(3, 0, COM1); // reading the data here
        if (status & DATA_READY)
            if ((out = bioscom(2, 0, COM1) & 0 7F) != 0) 
                putch(out);                // printing read value

        if (kbhit( ))    // If Esc is hit. it breaks and exit.
        { 
            if ((in = getch( )) == ‘ 1B’)   //  1B = Esc
            DONE = TRUE; 
            bioscom(1, in, COM1);  // data write. I am not making use of it.
        } 
    }
    return 0; 
}   

传入的数据对滚动和音调进行编码,类似于"R:+XXX.XX P:-YYY.YY\r\n"

我不想只打印这些数据,而是将其存储在dataRead[]数组中并将其解释为浮点值。例如,dataRead[2]dataRead[8]为&#34; roll&#34;编码浮点值。作为字符+XXX.XX

如何将这些字符存储在数组中并从中获取浮点数?

如果你能写下串口的一些代码,它完全符合我的要求那么它会非常有用。请确保它是用C&#39;。

写的

1 个答案:

答案 0 :(得分:1)

我不熟悉Dev C ++,但在C ++中你有 strtod 函数,它将字符串转换为double(float)。你需要:

  1. 在一个文本行中收集串口中的所有字符

  2. 解析行

  3. 首先很容易,只需等到“\ n”即可。类似的东西:

     char line [MAX_LINE];
     if(out == '\n')
       parse_line(line. ....)
     else
       line[n_readed++] = out;
    

    第二部分更棘手。您可以使用一些文本处理库来解析或编写您的文本 使用 strtod 自己的解析功能。由于你的案子很简单,我宁愿做第二件事。以下是解析文本行的解析函数示例:

     const char* line = "R:+123.56P:-767.77\r\n";
    
     // return true on success
     bool parse_line(const char* line, double* R, double* P)
     {
        const char* p = line;
    
        if(*p++ != 'R')
          return false;
    
        if(*p++ != ':')
          return false;
    
        if(*p == '+') // + sign is optional
          p++ ;
    
        char* pEnd;
        *R = strtod (p, &pEnd);
    
        if(pEnd == p)
          return false;
    
        p = pEnd;
    
        if(*p++ != 'P')
          return false;
    
        if(*p++ != ':')
          return false;
    
        *P = strtod (p, &pEnd);
    
        if(pEnd == p)
          return false;
    
        return true;
    }
    
    int main()
    {
      double R,P;
      if(!parse_line(line, &R, &P))
         printf("error\n");
      else
         printf("sucessfully readed: %f\t%f\n", R,P);
    
      return 0;
    }
    

    当解析函数返回true时,您需要声明两个float数组并用解析的float值填充它们。否则会出现一些错误,可能是因为数据损坏。您还可以使用浮动更改所有双打。

    我希望这能帮到你。