从串口读取

时间:2013-03-06 21:29:34

标签: c linux serial-port

这是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);
}

那么如何逐行阅读?

3 个答案:

答案 0 :(得分: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,并且还需要处理多个{{1在相同的缓冲区内隐含多行。

答案 1 :(得分:2)

您无法保证对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;

答案 2 :(得分:0)

可能你必须亲自实施。只要逐字逐句阅读,直到你到达'\ n',并返回你所读的内容。

我没有检查,但我怀疑通常是如何实现'readline'。