C语言中获取设备输入流的方法有多种,包括使用标准输入、文件输入、串口输入等。通过标准输入函数如scanf
、getchar
,文件输入函数如fscanf
、fgets
,以及串口通信库如termios
等,可以实现设备输入流的获取。 下面将详细介绍如何使用这些方法获取设备输入流。
一、标准输入(Standard Input)
在C语言中,标准输入通常指从键盘获取输入。最常用的标准输入函数包括scanf
和getchar
。
1、使用scanf
函数
scanf
函数是一个格式化输入函数,用于从标准输入读取数据并将其存储在指定的变量中。
#include <stdio.h>
int main() {
int num;
char str[100];
printf("Enter an integer: ");
scanf("%d", &num);
printf("You entered: %dn", num);
printf("Enter a string: ");
scanf("%s", str);
printf("You entered: %sn", str);
return 0;
}
在上面的代码中,scanf
函数从标准输入读取一个整数和一个字符串。
2、使用getchar
函数
getchar
函数用于从标准输入读取一个字符。
#include <stdio.h>
int main() {
char ch;
printf("Enter a character: ");
ch = getchar();
printf("You entered: %cn", ch);
return 0;
}
在这个示例中,getchar
函数用于读取单个字符输入。
二、文件输入(File Input)
文件输入是指从文件中读取数据。C语言中常用的文件输入函数包括fscanf
、fgets
等。
1、使用fscanf
函数
fscanf
函数类似于scanf
,但它是从文件流中读取数据。
#include <stdio.h>
int main() {
FILE *file;
int num;
char str[100];
file = fopen("input.txt", "r");
if (file == NULL) {
printf("Could not open filen");
return 1;
}
fscanf(file, "%d", &num);
fscanf(file, "%s", str);
printf("Read from file: %d, %sn", num, str);
fclose(file);
return 0;
}
在上面的代码中,fscanf
函数用于从文件input.txt
中读取整数和字符串。
2、使用fgets
函数
fgets
函数用于从文件流中读取一行文本。
#include <stdio.h>
int main() {
FILE *file;
char str[100];
file = fopen("input.txt", "r");
if (file == NULL) {
printf("Could not open filen");
return 1;
}
while (fgets(str, 100, file) != NULL) {
printf("Read from file: %s", str);
}
fclose(file);
return 0;
}
在这个示例中,fgets
函数用于从文件input.txt
中逐行读取文本并打印到标准输出。
三、串口输入(Serial Input)
串口通信是指通过串行端口传输数据。在Linux系统中,可以使用termios
库进行串口通信。
1、配置串口
首先,需要配置串口的参数,如波特率、数据位等。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int configure_serial_port(int fd) {
struct termios tty;
memset(&tty, 0, sizeof tty);
if (tcgetattr(fd, &tty) != 0) {
printf("Error %d from tcgetattr: %sn", errno, strerror(errno));
return -1;
}
cfsetospeed(&tty, B9600);
cfsetispeed(&tty, B9600);
tty.c_cflag |= (CLOCAL | CREAD);
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CRTSCTS;
tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
tty.c_iflag &= ~(ICRNL | INLCR);
tty.c_oflag &= ~OPOST;
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
printf("Error %d from tcsetattr: %sn", errno, strerror(errno));
return -1;
}
return 0;
}
2、读取串口数据
配置完串口后,可以使用read
函数从串口读取数据。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int main() {
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) {
printf("Error %d opening /dev/ttyS0: %sn", errno, strerror(errno));
return 1;
}
if (configure_serial_port(fd) != 0) {
return 1;
}
char buf[100];
int n = read(fd, buf, sizeof(buf));
if (n < 0) {
printf("Error %d reading from /dev/ttyS0: %sn", errno, strerror(errno));
return 1;
}
buf[n] = '