工作环境
usb转ttl串口线,usb插电脑端、另一端连接开发板或其他串口通讯设备
代码思路
1.打开串口
2.配置串口参数
3.发送函数
4.接收函数
5.主函数
1.打开串口
// 打开串口
HANDLE OpenSerialPort(const char *portName) {
HANDLE hSerial = CreateFileA(portName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
printf("Error opening serial port: %d\n", GetLastError());
return INVALID_HANDLE_VALUE;
}
return hSerial;
}
2.配置串口参数
// 配置串口参数
BOOL SetupSerialPort(HANDLE hSerial) {
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength = sizeof(DCB);
// 获取当前串口设置并修改
if (!GetCommState(hSerial, &dcbSerialParams)) {
printf("Error getting current serial port settings: %d\n", GetLastError());
CloseHandle(hSerial);
return FALSE;
}
// 设置波特率和其他参数
dcbSerialParams.BaudRate = BAUD_RATE;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
printf("Error setting serial port parameters: %d\n", GetLastError());
CloseHandle(hSerial);
return FALSE;
}
// 设置超时参数
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
if (!SetCommTimeouts(hSerial, &timeouts)) {
printf("Error setting timeouts: %d\n", GetLastError());
CloseHandle(hSerial);
return FALSE;
}
return TRUE;
}
3.发送函数
// 发送数据到串口
BOOL WriteToSerialPort(HANDLE hSerial, const char *data) {
DWORD bytesWritten;
if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL)) {
printf("Error writing to serial port: %d\n", GetLastError());
return FALSE;
}
return TRUE;
}
4.接收函数
// 从串口读取数据
BOOL ReadFromSerialPort(HANDLE hSerial, char *buffer, DWORD size) {
DWORD bytesRead;
if (!ReadFile(hSerial, buffer, size, &bytesRead, NULL)) {
printf("Error reading from serial port: %d\n", GetLastError());
return FALSE;
}
buffer[bytesRead] = '\0'; // 添加结束符以形成字符串
return TRUE;
}
5.主函数
int main() {
HANDLE hSerial = OpenSerialPort(PORT_NAME);
if (hSerial != INVALID_HANDLE_VALUE) {
if (SetupSerialPort(hSerial)) {
char sendData[] = "Hello, World!";
WriteToSerialPort(hSerial, sendData);
char receiveBuffer[BUFFER_SIZE];
ReadFromSerialPort(hSerial, receiveBuffer, BUFFER_SIZE);
printf("Received: %s\n", receiveBuffer);
CloseHandle(hSerial);
}
}
return 0;
}
完整代码段:
#include <windows.h>
#include <stdio.h>
#define BAUD_RATE CBR_9600
#define PORT_NAME "COM1"
#define BUFFER_SIZE 256
// 打开串口
HANDLE OpenSerialPort(const char *portName) {
HANDLE hSerial = CreateFileA(portName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
printf("Error opening serial port: %d\n", GetLastError());
return INVALID_HANDLE_VALUE;
}
return hSerial;
}
// 配置串口参数
BOOL SetupSerialPort(HANDLE hSerial) {
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength = sizeof(DCB);
// 获取当前串口设置并修改
if (!GetCommState(hSerial, &dcbSerialParams)) {
printf("Error getting current serial port settings: %d\n", GetLastError());
CloseHandle(hSerial);
return FALSE;
}
// 设置波特率和其他参数
dcbSerialParams.BaudRate = BAUD_RATE;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
printf("Error setting serial port parameters: %d\n", GetLastError());
CloseHandle(hSerial);
return FALSE;
}
// 设置超时参数
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
if (!SetCommTimeouts(hSerial, &timeouts)) {
printf("Error setting timeouts: %d\n", GetLastError());
CloseHandle(hSerial);
return FALSE;
}
return TRUE;
}
// 发送数据到串口
BOOL WriteToSerialPort(HANDLE hSerial, const char *data) {
DWORD bytesWritten;
if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL)) {
printf("Error writing to serial port: %d\n", GetLastError());
return FALSE;
}
return TRUE;
}
// 从串口读取数据
BOOL ReadFromSerialPort(HANDLE hSerial, char *buffer, DWORD size) {
DWORD bytesRead;
if (!ReadFile(hSerial, buffer, size, &bytesRead, NULL)) {
printf("Error reading from serial port: %d\n", GetLastError());
return FALSE;
}
buffer[bytesRead] = '\0'; // 添加结束符以形成字符串
return TRUE;
}
int main() {
HANDLE hSerial = OpenSerialPort(PORT_NAME);
if (hSerial != INVALID_HANDLE_VALUE) {
if (SetupSerialPort(hSerial)) {
char sendData[] = "Hello, World!";
WriteToSerialPort(hSerial, sendData);
char receiveBuffer[BUFFER_SIZE];
ReadFromSerialPort(hSerial, receiveBuffer, BUFFER_SIZE);
printf("Received: %s\n", receiveBuffer);
CloseHandle(hSerial);
}
}
return 0;
}