首页 > 系统相关 >十万个为什么 [串口] Windows 串口读写

十万个为什么 [串口] Windows 串口读写

时间:2024-08-05 18:39:32浏览次数:13  
标签:baud index handle 十万个 Windows dcb 串口 last open

#include <Windows.h>

#include <stdint.h>
#include <stdio.h>

// ---------------------------------------------------------------------------
class serial_t
{
public:
	~serial_t() { close(); }

	bool is_open() { return m_handle != INVALID_HANDLE_VALUE; }

public:
	void open(uint8_t index, uint32_t baud);

	void close();

	void change_baud(uint32_t baud);

	int read(uint8_t* buffer, int buffer_size);

	int write(uint8_t* buffer, int tx_size);

private:
	// 句柄
	HANDLE m_handle{INVALID_HANDLE_VALUE};

	// 上次打开的序号
	uint8_t m_last_index{0xFF};

	// 上次的波特率
	uint32_t m_last_baud{0};
};

// ---------------------------------------------------------------------------
void serial_t::open(uint8_t index, uint32_t baud)
{
	// 已经打开
	if (is_open() && m_last_index == index)
	{
		// 更换了波特率, 设置波特率
		if (baud != 0 && m_last_baud != baud)
		{
			change_baud(baud);
		}

		return;
	}

	// 关闭之前
	if (is_open())
	{
		close();
	}

	// 路径
	char path[MAX_PATH];
	snprintf(path, MAX_PATH, "\\\\.\\\\COM%d", index);

	// 打开新的
	m_handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (is_open() == false)
	{
		return;
	}

	// 记录打开
	m_last_index = index;

	// 设置(PS:不知道设置的是什么)
	SetCommMask(m_handle, EV_RXCHAR | EV_TXEMPTY | EV_ERR);
	PurgeComm(m_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

	// 读写阻塞的时间
	COMMTIMEOUTS time_out = {0};
	time_out.ReadIntervalTimeout = 100; 	// 100ms
	SetCommTimeouts(m_handle, &time_out);

	// 设置波特率
	change_baud(baud);
}


// ---------------------------------------------------------------------------
void serial_t::close()
{
	if (m_handle != INVALID_HANDLE_VALUE)
	{
		PurgeComm(m_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
		CloseHandle(m_handle);
		m_handle = INVALID_HANDLE_VALUE;
		m_last_index = 0xFF;
		m_last_baud = 0;
	}
}


// ---------------------------------------------------------------------------
void serial_t::change_baud(uint32_t baud)
{
	if (!is_open() || baud == 0 || m_last_baud == baud)
	{
		return;
	}

	m_last_baud = baud;

	DCB dcb = {0};
	dcb.DCBlength = sizeof(DCB);
	GetCommState(m_handle, &dcb);

	dcb.fBinary 	= TRUE;
	dcb.fParity 	= FALSE;
	dcb.BaudRate 	= baud;
	dcb.ByteSize 	= 8;
	dcb.Parity 		= NOPARITY;
	dcb.StopBits 	= ONESTOPBIT;
	dcb.fDtrControl = DTR_CONTROL_DISABLE;
	dcb.fRtsControl = RTS_CONTROL_ENABLE;
	dcb.fOutxCtsFlow = 0;
	dcb.fOutxDsrFlow = 0;
	SetCommState(m_handle, &dcb);
}

// ---------------------------------------------------------------------------
int serial_t::read(uint8_t* buffer, int buffer_size)
{
	if (is_open())
	{

	}
	return 0;
}

// ---------------------------------------------------------------------------
int serial_t::write(uint8_t* buffer, int tx_size)
{
	if (is_open())
	{

	}
	return 0;
}

// ---------------------------------------------------------------------------
int main()
{
}

 

标签:baud,index,handle,十万个,Windows,dcb,串口,last,open
From: https://www.cnblogs.com/kehuadong/p/18343830

相关文章

  • 十万个为什么 [Windows] 获取串口号
    #include<Windows.h>#include<SetupAPI.h>//-lsetupapi#include<devguid.h>//-luuid#include<stdio.h>#include<map>usingnamespacestd;map<string,string>get_serial_ports(){ map<string,string>por......
  • 解决windows报错:该文件没有与之关联的应用来执行该操作
    报错截图:解决方案1、新建txt文件2、复制内容到txt文件taskkill/f/imexplorer.exeregadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIcons"/v29/d"C:\Windows\system32\imageres.dll,154"/treg_sz/fregadd......
  • cmake引入第三方库的debug和release版本之Windows版本
    概述#本文将介绍cmak引入第三方库debug和release不同配置。Windows上,习惯将debug模式下生成的动态库名后缀添加D以作和release区分。cmake创建一个项目A,A引入动态库B,cmake怎么配置A链接动态库B的debug和release对应的库呢本文的教程是基于 这里,如果没有看,我推荐你先看......
  • BitDock:为Windows桌面带来Mac风格的美化工具(附下载)
    许多人对Mac系统的精致界面情有独钟,但面对苹果电脑不菲的价格标签——就例如年初新登场的基础款MacBookAir,即便配置朴素,也轻易跨过了八千大关(这预算在Windows阵营足以拥抱高端配置),不免让人望而却步。幸运的是,将Windows系统改头换面,焕发Mac般的高雅并非遥不可及的梦想。下载:Bi......
  • 一款专业的 Windows 恶意程序分析与清理工具
    大家好,今天给大家分享一款专业的Windows恶意程序分析与清理工具OpenArk,它能够帮助用户发现系统中隐藏的恶意软件。OpenArk是一款Windows平台上的开源Ark工具.Ark是Anti-Rootkit(对抗恶意程序)的简写,OpenArk目标成为逆向工程师、编程人员的工具,同时也能为那些希望清理恶意软......
  • Parallels Desktop19.3.0虚拟机软件可以让你在Mac上同时运行Windows、Linux等多个系统
    ParallelsDesktop19,一个虚拟机软件,可以让你在Mac上同时运行Windows、Linux等多个系统。听起来是不是很厉害?但其实它还有更多隐藏的小技巧等着你去发现。如果你还在因为Mac和Windows之间的不兼容而苦恼,那么ParallelsDesktop19就是你的救星。它可以帮助你轻松地在Mac上运行Win......
  • Parallels Desktop19Mac就是这样一个神器!在Windows和Mac之间反复切换横跳!
    在Windows和Mac之间反复横跳,是很多职场人的常态。Windows系统生态完善,软件丰富;而Mac的优雅设计、出色的性能以及稳定的系统体验也让人难以舍弃。但鱼与熊掌不可得兼,两个系统来回切换,需要准备两台电脑,既麻烦又占用空间,还增加了经济负担。如果一台电脑可以同时运行两个操作系......
  • windows 获取套接字连接状态
     GetTcpTable 和 GetTcpTable2 都是WindowsAPI中用于获取TCP连接表格的函数,但它们有一些关键的区别:GetTcpTable定义:GetTcpTable 函数用于获取TCP连接的表格信息。结构体:它使用 MIB_TCPTABLE 结构体来表示TCP连接的表格。兼容性:GetTcpTable 是早期的......
  • 面向-Windows-程序员的-C---软件互操作教程-全-
    面向Windows程序员的C++软件互操作教程(全)原文:C++SoftwareInteroperabilityforWindowsProgrammers协议:CCBY-NC-SA4.0一、准备介绍本章介绍了软件互操作性项目。我们先简要了解一下先决条件。接下来是项目概述。最后,我们描述了项目的主要组成部分以及它们是如何组......
  • 【攻防技术系列+权限维持】Windows开机启动项
    一、简介在我们的计算机开机的时候,总是会有一些程序和服务自动启动,这其中包括Windows操作系统运行所必需的程序和其他用户程序。这是操作系统给用户提供的功能,意在为用户开机启动程序提供方便,我们不必每次启动时都手动的打开一些必须打开的程序。二、常见开机启动项2.1启动文......