同步方式串口收发数据
2023-06-15
95
0
以下是一个简单的win32串口通信程序,该程序使用了Windows API中的CreateFile、SetCommTimeouts、SetCommState、WriteFile和ReadFile等函数来进行串口通信。
#include <windows.h>
#include <stdio.h>
// 定义串口句柄
HANDLE hSerial;
// 串口接收线程函数
DWORD WINAPI receiveThread(LPVOID lpParameter)
{
// 定义变量用于读取串口数据
char buffer[1024];
DWORD bytesRead;
while (true)
{
// 从串口读取数据
if (ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL))
{
// 打印收到的数据
printf("Received data: %s\n", buffer);
}
// 暂停50毫秒,避免线程占用过多CPU资源
Sleep(50);
}
}
int main()
{
// 打开串口,注意这里是同步方式
hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSerial == INVALID_HANDLE_VALUE)
{
printf("Failed to open serial port!\n");
return 1;
}
// 配置串口参数
DCB serialParams = { 0 };
serialParams.DCBlength = sizeof(serialParams);
GetCommState(hSerial, &serialParams);
serialParams.BaudRate = CBR_115200;
serialParams.ByteSize = 8;
serialParams.Parity = NOPARITY;
serialParams.StopBits = TWOSTOPBITS;
SetCommState(hSerial, &serialParams);
// 配置串口超时时间
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
SetCommTimeouts(hSerial, &timeouts);
// 创建线程用于接收串口数据
HANDLE hThread = CreateThread(NULL, 0, receiveThread, NULL, 0, NULL);
// 定时发送5个字符
while (true)
{
char buffer[] = "Hello";
DWORD bytesWritten;
// 发送数据到串口
if (WriteFile(hSerial, buffer, sizeof(buffer) - 1, &bytesWritten, NULL))
{
// 打印发送的数据
printf("Sent data: %s\n", buffer);
}
// 暂停1秒钟
Sleep(1000);
}
return 0;
}
上面的代码实现了一个简单的串口通信程序,主线程在每个1秒钟定时发送5个字符到串口,接收线程不断读取串口数据并打印。需要注意的是,由于串口通信是一个异步操作,接收线程需要不断地读取串口缓冲区中的数据,并且不能占用过多的CPU资源,否则会导致程序变得非常卡顿。因此,我们在接收线程中使用了Sleep函数来暂停线程,避免CPU资源被过度占用。