C语言中的串口编程详解
在C语言中进行串口编程通常涉及操作系统提供的API。以下是针对Windows和Linux系统的串口编程的基本步骤和代码示例。
Windows中的串口编程
在Windows上,串口是通过Win32 API来进行操作的。下面是一个简单的实现示例:
#include <windows.h>
#include <stdio.h>
void configureSerialPort(HANDLE hSerial) {
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
printf("Error getting state\n");
return;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
printf("Error setting state\n");
}
}
int main() {
HANDLE hSerial = CreateFile("\\\\.\\COM3",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hSerial == INVALID_HANDLE_VALUE) {
printf("Error opening serial port\n");
return 1;
}
configureSerialPort(hSerial);
// Example: writing data
char data[] = "Hello, Serial Port!";
DWORD bytesWritten;
if (!WriteFile(hSerial, data, sizeof(data), &bytesWritten, NULL)) {
printf("Error writing to serial port\n");
}
CloseHandle(hSerial);
return 0;
}
Linux中的串口编程
在Linux上,串口编程主要通过文件I/O和termios接口。以下是一个简单的实现示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
void configureSerialPort(int fd) {
struct termios tty;
memset(&tty, 0, sizeof tty);
if (tcgetattr(fd, &tty) != 0) {
printf("Error getting tty attributes\n");
return;
}
cfsetospeed(&tty, B9600);
cfsetispeed(&tty, B9600);
tty.c_cflag &= ~PARENB; // No parity
tty.c_cflag &= ~CSTOPB; // One stop bit
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8; // 8 bits per byte
tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines
tty.c_lflag &= ~ICANON;
tty.c_lflag &= ~ECHO;
tty.c_lflag &= ~ECHOE;
tty.c_lflag &= ~ECHONL;
tty.c_lflag &= ~ISIG;
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes
tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed
tty.c_cc[VTIME] = 10; // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.
tty.c_cc[VMIN] = 0;
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
printf("Error setting tty attributes\n");
}
}
int main() {
int serialPort = open("/dev/ttyS0", O_RDWR);
if (serialPort < 0) {
printf("Error opening serial port\n");
return 1;
}
configureSerialPort(serialPort);
// Example: writing data
char data[] = "Hello, Serial Port!";
write(serialPort, data, sizeof(data));
close(serialPort);
return 0;
}
注意事项
- 确保指定的串口号在系统中存在。
- 合理设置波特率、数据位、停止位和校验位等参数。
- 串口通信时需要考虑接收和发送的缓冲处理。
- Windows和Linux对串口设备的访问权限和方法有所不同,注意权限设置和设备路径。
以上仅为基本的示例,实际应用中可能需要根据具体需求调整配置。