引言串口通信作为一种古老但仍然广泛使用的通信方式,在嵌入式系统、工业控制、设备调试等领域扮演着重要角色。C语言由于其高效性和灵活性,成为实现串口通信的首选编程语言。本文将带您从入门到实战,深入解析C语...
串口通信作为一种古老但仍然广泛使用的通信方式,在嵌入式系统、工业控制、设备调试等领域扮演着重要角色。C语言由于其高效性和灵活性,成为实现串口通信的首选编程语言。本文将带您从入门到实战,深入解析C语言串口编程,揭秘串口通信的奥秘。
串口通信,也称为串行通信,是指数据以串行的方式一位接一位地传输。在计算机硬件中,串口通常指的是RS-232接口,它定义了数据线、信号电平、传输速率等标准。
在Windows环境下,可以使用WinAPI函数打开串口。以下是一个示例代码:
#include
HANDLE OpenSerialPort(const char* portName) { HANDLE hSerial = CreateFile( portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hSerial == INVALID_HANDLE_VALUE) { // 错误处理 } return hSerial;
} 使用SetCommState函数配置串口参数,如下所示:
#include
#include
BOOL ConfigureSerialPort(HANDLE hSerial, DWORD baudRate, DWORD dataBits, DWORD stopBits, DWORD parity) { DCB dcbSerialParams = {0}; dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { // 错误处理 return FALSE; } dcbSerialParams.BaudRate = baudRate; dcbSerialParams.ByteSize = dataBits; dcbSerialParams.StopBits = stopBits; dcbSerialParams.Parity = parity; if (!SetCommState(hSerial, &dcbSerialParams)) { // 错误处理 return FALSE; } return TRUE;
} 使用ReadFile函数读取串口数据:
#include
int ReadSerialPort(HANDLE hSerial, char* buffer, DWORD bufferSize) { DWORD bytesRead; if (!ReadFile(hSerial, buffer, bufferSize, &bytesRead, NULL)) { // 错误处理 return -1; } return (int)bytesRead;
} 使用WriteFile函数写入串口数据:
#include
int WriteSerialPort(HANDLE hSerial, const char* buffer, DWORD bufferSize) { DWORD bytesWritten; if (!WriteFile(hSerial, buffer, bufferSize, &bytesWritten, NULL)) { // 错误处理 return -1; } return (int)bytesWritten;
} 使用CloseHandle函数关闭串口:
#include
void CloseSerialPort(HANDLE hSerial) { CloseHandle(hSerial);
} 在Linux环境下,串口编程通常使用termios结构体进行配置。以下是一个示例代码:
#include
#include
#include
#include
#include
int OpenSerialPort(const char* portName) { int fd = open(portName, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { // 错误处理 return -1; } return fd;
}
void ConfigureSerialPort(int fd, int baudRate, int dataBits, int stopBits, int parity) { struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, baudRate); cfsetospeed(&options, baudRate); options.c_cflag &= ~PARENB; // 无校验位 options.c_cflag &= ~CSTOPB; // 1个停止位 options.c_cflag &= ~CSIZE; // 清除所有大小位 options.c_cflag |= CS8; // 8位数据位 if (parity == 'O') { options.c_cflag |= (PARENB | PARODD); // 奇校验 } else if (parity == 'E') { options.c_cflag |= (PARENB | PARENB); // 偶校验 } options.c_cflag &= ~CRTSCTS; // 无硬件流控制 options.c_cflag |= CREAD | CLOCAL; // 开启接收,忽略modem控制线 tcsetattr(fd, TCSANOW, &options);
}
int ReadSerialPort(int fd, char* buffer, int bufferSize) { int n = read(fd, buffer, bufferSize); if (n < 0) { // 错误处理 return -1; } return n;
}
int WriteSerialPort(int fd, const char* buffer, int bufferSize) { int n = write(fd, buffer, bufferSize); if (n < 0) { // 错误处理 return -1; } return n;
}
void CloseSerialPort(int fd) { close(fd);
} 通过本文的学习,您应该已经掌握了C语言串口编程的基本知识。在实际应用中,需要根据具体需求调整串口参数,并处理各种异常情况。希望本文能帮助您更好地理解和应用串口通信技术。