当前位置: 首页 > news >正文

使用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

相关文章:

  • 学习JAVA的第十八天(基础)
  • 信息系统项目管理师--成本管理
  • 重要通告 | 公司更名为“浙江实在智能科技有限公司”
  • 算法训练营day46,动态规划14
  • 链路负载均衡之策略路由
  • python——http/https文件传输
  • Python(38):Request的data需入参是json,用转换json.dumps(data)
  • 小迪安全36WEB 攻防-通用漏洞XSS 跨站MXSSUXSSFlashXSSPDFXSS
  • 【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024
  • 【c++11线程库的使用】
  • 基于深度学习YOLOv8+Pyqt5的抽烟吸烟检测识别系统(源码+跑通说明文件)
  • ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树
  • 割点原理及封装好的割点类
  • 【Docker】在 Ubuntu20.04 上配置 Docker 开发环境
  • 【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2017 年终总结 —— 在路上
  • co模块的前端实现
  • docker容器内的网络抓包
  • exports和module.exports
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Joomla 2.x, 3.x useful code cheatsheet
  • JSDuck 与 AngularJS 融合技巧
  • Mithril.js 入门介绍
  • python学习笔记-类对象的信息
  • Redis 懒删除(lazy free)简史
  • 闭包,sync使用细节
  • 创建一个Struts2项目maven 方式
  • 第2章 网络文档
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 利用jquery编写加法运算验证码
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法-图和图算法
  • 学习ES6 变量的解构赋值
  • 一、python与pycharm的安装
  • 一文看透浏览器架构
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • FaaS 的简单实践
  • ​ArcGIS Pro 如何批量删除字段
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ###C语言程序设计-----C语言学习(6)#
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (windows2012共享文件夹和防火墙设置
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (蓝桥杯每日一题)love
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)c52学习之旅-流水LED灯
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .bat批处理出现中文乱码的情况
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .Net MVC + EF搭建学生管理系统
  • .NET成年了,然后呢?