
C 语言 如何设置串口波特率:波特率是串口通信中非常重要的一个参数,直接影响数据传输的速度和质量。在C语言中设置串口波特率通常涉及打开串口设备、配置串口参数、设置波特率。其中,最常用的方法是通过termios库来进行配置。
一、打开串口设备
在使用C语言进行串口通信之前,首先需要打开串口设备。通常,串口设备在Linux系统下以文件的形式存在。可以使用open()函数来打开串口设备文件。
#include <fcntl.h>
#include <unistd.h>
int open_serial_port(const char *device) {
int fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("Unable to open port");
} else {
fcntl(fd, F_SETFL, 0);
}
return fd;
}
二、配置串口参数
配置串口参数是确保通信正常进行的重要步骤。通常使用termios结构体来设置串口参数。
#include <termios.h>
#include <stdio.h>
int configure_serial_port(int fd, speed_t baud_rate) {
struct termios options;
if (tcgetattr(fd, &options) < 0) {
perror("Failed to get attributes");
return -1;
}
cfsetispeed(&options, baud_rate);
cfsetospeed(&options, baud_rate);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
if (tcsetattr(fd, TCSANOW, &options) < 0) {
perror("Failed to set attributes");
return -1;
}
return 0;
}
三、设置波特率
设置波特率的核心是cfsetispeed和cfsetospeed函数,这两个函数分别用于设置输入和输出的波特率。
speed_t get_baud_rate(int rate) {
switch (rate) {
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
default: return B9600; // default to 9600 if unsupported rate
}
}
int set_serial_baud_rate(int fd, int rate) {
speed_t baud_rate = get_baud_rate(rate);
return configure_serial_port(fd, baud_rate);
}
四、读取和写入数据
完成上述配置后,即可进行数据的读取和写入操作。使用read和write函数来实现数据通信。
ssize_t read_from_serial(int fd, void *buf, size_t len) {
return read(fd, buf, len);
}
ssize_t write_to_serial(int fd, const void *buf, size_t len) {
return write(fd, buf, len);
}
五、关闭串口设备
在通信结束后,记得关闭串口设备以释放资源。
void close_serial_port(int fd) {
close(fd);
}
六、完整示例
将以上所有步骤结合起来,形成一个完整的示例程序。
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
int open_serial_port(const char *device) {
int fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("Unable to open port");
} else {
fcntl(fd, F_SETFL, 0);
}
return fd;
}
int configure_serial_port(int fd, speed_t baud_rate) {
struct termios options;
if (tcgetattr(fd, &options) < 0) {
perror("Failed to get attributes");
return -1;
}
cfsetispeed(&options, baud_rate);
cfsetospeed(&options, baud_rate);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
if (tcsetattr(fd, TCSANOW, &options) < 0) {
perror("Failed to set attributes");
return -1;
}
return 0;
}
speed_t get_baud_rate(int rate) {
switch (rate) {
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
default: return B9600;
}
}
int set_serial_baud_rate(int fd, int rate) {
speed_t baud_rate = get_baud_rate(rate);
return configure_serial_port(fd, baud_rate);
}
ssize_t read_from_serial(int fd, void *buf, size_t len) {
return read(fd, buf, len);
}
ssize_t write_to_serial(int fd, const void *buf, size_t len) {
return write(fd, buf, len);
}
void close_serial_port(int fd) {
close(fd);
}
int main() {
const char *device = "/dev/ttyS0"; // specify your serial port device
int baud_rate = 9600;
int fd = open_serial_port(device);
if (fd == -1) {
return 1;
}
if (set_serial_baud_rate(fd, baud_rate) == -1) {
close_serial_port(fd);
return 1;
}
const char *message = "Hello, Serial Port!";
write_to_serial(fd, message, strlen(message));
char buffer[256];
ssize_t n = read_from_serial(fd, buffer, sizeof(buffer));
if (n > 0) {
buffer[n] = '