使用Windows API实现一个简单的串口助手

使用Windows API实现一个简单的串口助手

目录

  • 使用window API开发一个具有字符串收发功能的串口助手
    • 开发环境
    • 串口设备相关的API
    • 步骤
    • 实现代码
    • 收发测试图

使用window API开发一个具有字符串收发功能的串口助手

开发环境

  • Visual Studio 2015

串口设备相关的API

  • CreateFile
    参数详情见:CreateFileA function (fileapi.h) - Win32 apps | Microsoft Learn

  • SetCommState
    参数详情见:SetCommState function (winbase.h) - Win32 apps | Microsoft Learn

  • GetCommState
    参数详情见:GetCommState function (winbase.h) - Win32 apps | Microsoft Learn

  • ReadFile
    参数详情见:ReadFile (Compact 2013) | Microsoft Learn

  • WriteFile
    参数详情见:WriteFile (Compact 2013) | Microsoft Learn

  • PurgeComm
    参数详情见:PurgeComm (Compact 2013) | Microsoft Learn

  • CloseHandle
    参数详情见:CloseHandle (Compact 2013) | Microsoft Learn


// 函数原型 
HANDLE WINAPI CreateFile(_In_      LPCTSTR lpFileName,_In_      DWORD dwDesiredAccess,_In_      DWORD dwShareMode,_In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,_In_      DWORD dwCreationDisposition,_In_      DWORD dwFlagsAndAttributes,_In_opt_  HANDLE hTemplateFile
);BOOL WINAPI SetCommState(_In_  HANDLE hFile,_In_  LPDCB lpDCB
);BOOL WINAPI GetCommState(_In_     HANDLE hFile,_Inout_  LPDCB lpDCB
);BOOL ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped
);BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped
);BOOL PurgeComm(HANDLE hFile,DWORD dwFlags
);BOOL CloseHandle(HANDLE hObject
);

步骤

  1. 创建一个设备句柄
  2. 创建一个设备文件
  3. 配置串口参数
  4. 创建读写线程
  5. 对设备文件进行读写
  6. 退出线程后关闭设备文件

实现代码


#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>HANDLE hCom; // 句柄,用于初始化串口DWORD WINAPI ThreadWrite(LPVOID lpParameter)
{char outputData[100] = { 0x00 }; // 输出数据缓存if (hCom == INVALID_HANDLE_VALUE){puts("打开串口失败");return 0;}DWORD strLength = 0;while (1){for (int i = 0; i < 100; i++){outputData[i] = 0;}fgets(outputData, 100, stdin); // 从控制台输入字符串strLength = strlen(outputData);printf("发送了%d个字节\r\n", strLength); // 打印字符串长度WriteFile(hCom, outputData, strLength, &strLength, NULL); // 串口发送字符串fflush(stdout);PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); // 清空缓冲区Sleep(100);}return 0;
}DWORD WINAPI ThreadRead(LPVOID lpParameter)
{// INVALID_HANDLE_VALUE表示出错,会设置GetLastErrorif (hCom == INVALID_HANDLE_VALUE)   {puts("打开串口失败");return 0;}char getputData[100] = { 0x00 }; // 输入数据缓存// 利用错误信息来获取进入串口缓冲区数据的字节数DWORD dwErrors; // 错误信息COMSTAT Rcs; // COMSTAT结构通信设备的当前信息int Len = 0;DWORD length = 100; //用来接收读取的字节数while (1){for (int i = 0; i < 100; i++){getputData[i] = 0;}ClearCommError(hCom, &dwErrors, &Rcs); // 获取读缓冲区数据长度Len = Rcs.cbInQue;ReadFile(hCom, getputData, Len, &length, NULL);  // 获取字符串PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);  // 清空缓冲区if (Len > 0){printf("接收的数据为:%s\r\n", getputData);fflush(stdout);}Sleep(100);}return 0;
}int main()
{// 初始化串口TCHAR *com_name = (TCHAR *)malloc(10 * sizeof(TCHAR));do{printf("请输入需要打开的串口号(示例:COM2):");scanf("%s",com_name);getchar();hCom = CreateFile(com_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hCom == INVALID_HANDLE_VALUE)printf("串口号不存在,请重新输入!\n");elsebreak;} while (1);free(com_name);// 获取和设置串口参数DCB myDCB;myDCB.BaudRate = 115200;       // 波特率myDCB.Parity = NOPARITY;     // 校验位myDCB.ByteSize = 8;          // 数据位myDCB.StopBits = ONESTOPBIT; // 停止位SetCommState(hCom, &myDCB);  // 设置串口参数printf("baud rate is %d\n", (int)myDCB.BaudRate);// 线程创建HANDLE HRead, HWrite;HWrite = CreateThread(NULL, 0, ThreadWrite, NULL, 0, NULL);HRead = CreateThread(NULL, 0, ThreadRead, NULL, 0, NULL);while (1);CloseHandle(HRead);CloseHandle(HWrite);CloseHandle(hCom);return 0;
}

收发测试图

  • 备注(左边为自己开发的串口软件,右边为正点原子团队开发的XCOM V2.0串口上位机软件)

图片资源加载失败

Posted By veis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/527438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LGR-177-Div.3】洛谷基础赛 #8 Westlake OI #1(仅A)

String Minimization a尽可能小的话&#xff0c;如果能和c交换更小就交换。 如果a和c相等&#xff0c;b交换能更小&#xff0c;就交换b。 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(…

数据库系统原理实验报告1 | E-R图设计

整理自博主2021级专业课《数据库系统原理》自己完成的实验报告。 目录 一、实验目的 二、实验内容 1、某个学校有若干个系 2、某工厂生产若干产品 3、某学校的田径运动会中设置了各类比赛 4、自己调查一个需要提供开发数据库应用系统的单位 三、实验结果总结 四、实验结…

爬虫练习:获取某招聘网站Python岗位信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(拉钩Python岗位数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [公司, 规模,岗位,地区,薪资,经验要求]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer…

海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍

在当今数字化时代&#xff0c;媒体宣发成为了企业推广产品和品牌的重要手段之一。其中&#xff0c;7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐&#xff0c;以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前&#xff0c;让…

day16_购物车(添加购物车,购物车列表查询,删除购物车商品,更新选中商品状态,完成购物车商品的全选,清空购物车)

文章目录 购物车模块1 需求说明2 环境搭建3 添加购物车3.1 需求说明3.2 远程调用接口开发3.2.1 ProductController3.2.2 ProductService 3.3 openFeign接口定义3.3.1 环境搭建3.3.2 接口定义3.3.3 降级类定义 3.4 业务后端接口开发3.4.1 添加依赖3.4.2 修改启动类3.4.3 CartInf…

vmware添加新磁盘

文章目录 前言一、新增磁盘二、初始化磁盘1.查看2.初始化3.挂载 总结 前言 虚拟机磁盘空间很散乱&#xff0c;大部分都在/root和/home下不好操作&#xff0c;故考虑新增磁盘、增加挂载点。 一、新增磁盘 右键打开虚拟机设置 二、初始化磁盘 1.查看 fdisk -l2.初始化 …

分布式执行引擎ray入门--(3)Ray Train

Ray Train中包含4个部分 Training function: 包含训练模型逻辑的函数 Worker: 用来跑训练的 Scaling configuration: 配置 Trainer: 协调以上三个部分 Ray TrainPyTorch 这一块比较建议直接去官网看diff&#xff0c;官网色块标注的比较清晰&#xff0c;非常直观。 impor…

CentOS 8启动流程

一、BIOS与UEFI BIOS Basic Input Output System的缩写&#xff0c;翻译过来就是“基本输入输出系统”&#xff0c;是一种业界标准的固件接口&#xff0c;第一次出现在1975年&#xff0c;是计算机启动时加载的第一个程序&#xff0c;主要功能是检测和设置计算机硬件&#xff…

验证码安全

目录 验证码识别&复用&调用&找回密码重定向&状态值 res 修改-找回密码修改返回状态值判定验证通过 验证码爆破-知道验证码规矩进行无次数限制爆破 短信轰炸原理 验证码识别&复用&调用&找回密码重定向&状态值 res 修改-找回密码修改返回状态…

【UE5】创建蓝图

创建GamePlay需要的相关蓝图 项目资源文末百度网盘自取 在 内容游览器 文件夹中创建文件夹&#xff0c;命名为 Blueprints &#xff0c;用来放这个项目的所有蓝图(Blueprint) 在 Blueprints 文件夹下新建文件夹 GamePlay ,用存放GamePlay相关蓝图 在 Blueprints 文件夹下创建文…

算法详解——leetcode150(逆波兰表达式)

欢迎来看博主的算法讲解 博主ID&#xff1a;代码小豪 文章目录 逆波兰表达式逆波兰表达式的作用代码将中缀表达式转换成后缀表达式文末代码 逆波兰表达式 先来看看leetcode当中的原题 大多数人初见逆波兰表达式的时候大都一脸懵逼&#xff0c;因为与平时常见的表达式不同&am…

CentOS网络故障排查秘笈:实战指南

前言 作为一名热爱折腾 Linux 的技术达人&#xff0c;我深知网络故障会让人抓狂&#xff01;在这篇文章里&#xff0c;我和你分享了我的心得体会&#xff0c;从如何分析问题、识别瓶颈&#xff0c;到利用各种神器解决网络难题。不管你是新手小白还是老鸟大神&#xff0c;这里都…