这是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);
}
那么如何逐行阅读?
答案 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'
字符,否则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'。