2

这是http://www.gravitech.us/7segmentshield.html给出的代码。

void SerialMonitorPrint (byte Temperature_H, int Decimal, bool IsPositive)
{
Serial.print("The temperature is ");
if (!IsPositive)
{
  Serial.print("-");
}
Serial.print(Temperature_H, DEC);
Serial.print(".");
Serial.print(Decimal, DEC);
Serial.print(" degree C");
Serial.print("\n\n");
}

但是当我尝试从串口读取数据时,我发现我是一个字符一个字符地读取数据。

更新

while(1)
{
    char buffer[100];
    int chars_read = read(fd, &buffer, sizeof(buffer));
    buffer[chars_read] = '\0';
    printf("%s", buffer);
}

那么如何逐行阅读?

4

3 回答 3

3

您不能保证一次调用read就会给您准确的一行文本。您需要缓冲数据。最简单的方法是一次只读取一个字符,并在到达换行符时停止。如果你想每次读取尽可能多的字符,缓冲代码就变得更加复杂。

试试这个开始:

char buffer[100] = {0};
int pos = 0;

while( pos < 99 ) {
    read(fd, buffer+pos, 1);           // Note you should be checking the result
    if( buffer[pos] == '\n' ) break;
    pos++;
}

// Normally you would null-terminate string, but noticed I initialised the
// buffer to all zeroes at the beginning.  So this is not strictly necessary.
// However, in this case it will remove the newline character.
buffer[pos] = 0;
于 2013-03-06T21:39:46.270 回答
3

while 循环不一定逐个字符地读取,但它可能会根据串行端口设备和传输速率为每次读取一次返回一个字符。

我进行了一些更改以修复您的 while 循环中的一些错误:

while(1)
{
    char buffer[100];
    ssize_t length = read(fd, &buffer, sizeof(buffer));
    if (length == -1)
    {
        printf("Error reading from serial port\n");
        break;
    }
    else if (length == 0)
    {
        printf("No more data\n");
        break;
    }
    else
    {
        buffer[length] = '\0'
        printf("%s", buffer);
    }
}

变更清单

  • 检查返回值read
  • 我假设当读取失败或返回 0 时,这意味着不再读取数据并中断 while 循环执行。根据您的需要修改此行为。
  • 在打印之前附加一个'\0'字符,否则printf会在缓冲区中打印垃圾值。

注释:

  • 不要担心行,读取应该\n在缓冲区中返回一个字符,printf当你打印出来时它会解释为换行符。
  • 如果您实际上只对抓取一条线并将其存储在某处感兴趣,则需要读取并附加到另一个缓冲区,直到您\n在缓冲区中获得 a ,并且还需要\n在同一个缓冲区中处理多个暗示多行的内容。
于 2013-03-06T21:41:55.200 回答
0

可能你必须自己实现。继续逐个字符地阅读,直到到达“\n”,然后返回你所阅读的内容。

我没有检查,但我怀疑“readline”通常是这样实现的。

于 2013-03-06T21:35:13.687 回答