CreateFile系类异步、并行(同一个串口发送接收)
在Windows系统下,串口数据收发CreateFile系类方法对于我来说是最好用的方法,采用异步机制保证了串口读或写入不会使代码停在串口函数内(停在串口函数内原因可能是串口线的原因,或者串口没打开(这个是猜测)),并且可以达到同一个串口既发送并接收(测试方法:串联串口线)。
下面说下CreateFile函数串口创建打开、初始化串口以及串口关闭:
函数定义如下:
WINBASEAPI
__out
HANDLE
WINAPI
CreateFile(__in LPCWSTR lpFileName,__in DWORD dwDesiredAccess,__in DWORD dwShareMode,__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,__in DWORD dwCreationDisposition,__in DWORD dwFlagsAndAttributes,__in_opt HANDLE hTemplateFile);
函数使用如下:
串口异步打开:m_hWriteFile = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);if ((HANDLE)0 == m_hWriteFile || (HANDLE)-1 == m_hWriteFile){MessageBox("没有打开串口,或者串口被占用!");}串口初始化配置:SetupComm(m_hWriteFile,4096,1);//设置输入输出缓冲区DCB dcb;GetCommState(m_hWriteFile,&dcb);dcb.BaudRate = 115200;//比特率dcb.ByteSize = 8;dcb.Parity = NOPARITY;dcb.StopBits = /*TWOSTOPBITS*/ONESTOPBIT;//停止位SetCommState(m_hWriteFile,&dcb);//设置串口状态PurgeComm(m_hWriteFile,PURGE_TXCLEAR | PURGE_RXCLEAR);串口关闭:if ((HANDLE)0 != m_hWriteFile && (HANDLE)-1 != m_hWriteFile){CloseHandle(m_hWriteFile);m_hWriteFile = NULL;}
下面说下WriteFile异步写入串口数据方法:
函数定义如下:
WINBASEAPI
BOOL
WINAPI
WriteFile(__in HANDLE hFile,__in_bcount_opt(nNumberOfBytesToWrite) LPCVOID lpBuffer,__in DWORD nNumberOfBytesToWrite,__out_opt LPDWORD lpNumberOfBytesWritten,__inout_opt LPOVERLAPPED lpOverlapped);
函数使用如下:
OVERLAPPED ov;//异步数据储存的结构体
OMSTAT comstat;//串口结构体 ,用来清除串口错误 建议每次写数据前都清除一下
memset(&comstat,0,sizeof(comstat));
ClearCommError(collet->m_hWriteFile,&dwError,&comstat);DWORD dwBytesRead = 0;
memset(&ov,0,sizeof(OVERLAPPED));
ov.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建一个事件
BOOL bGetRead = WriteFile(collet->m_hWriteFile,SendFileStr,1,&dwBytesRead,&ov);
DWORD wait = WaitForSingleObject(ov.hEvent,1000);//设置一个事件超时时间
if (0 != ov.InternalHigh)//数据实际接收字节数
{nGetFilelength -= ov.InternalHigh;
}
else if (0 != dwBytesRead)
{nGetFilelength -= dwBytesRead;
}
下面说下ReadFile异步读取串口方法:
函数定义如下:
WINBASEAPI
BOOL
WINAPI
ReadFile(__in HANDLE hFile,__out_bcount_part_opt(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,__in DWORD nNumberOfBytesToRead,__out_opt LPDWORD lpNumberOfBytesRead,__inout_opt LPOVERLAPPED lpOverlapped);
函数使用如下:
DWORD dwError = 0;
COMSTAT comstat;//串口结构体 用来清除串口错误 ,建议每次读数据时都要先清除一下
memset(&comstat,0,sizeof(comstat));
ClearCommError(collet->m_hWriteFile,&dwError,&comstat);
if (0 == comstat.cbInQue)//判读是否有数据需要接收
{continue;
}
DWORD dwBytesRead = 0;
memset(&ov,0,sizeof(OVERLAPPED));
ov.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件
BOOL bGetRead = ReadFile(collet->m_hWriteFile,WriteFileStr,1,&dwBytesRead,&ov);
DWORD wait = WaitForSingleObject(ov.hEvent,1000);//设置事件超时时间
if (0 != ov.InternalHigh)
{nWriteTextLen += ov.InternalHigh;
}
else if (0 != dwBytesRead)
{nWriteTextLen += dwBytesRead;
}
使用说明:
1.ReadFile与WriteFile方法使用同一个串口句柄(同一个串口)可以达到同一个串口边发送边接收。
2.建议每次读或写串口的时候,先清空一下串口错误。
3.建议专门做个函数用来管理串口的打开与关闭,方便’并行’的使用。
CreateFile系类异步、并行(同一个串口发送接收)相关推荐
- STM32—USART串口发送+接收
STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...
- STM32串口发送接收数据
目录 1.串口通信 2.串口的结构体 3.如何配置串口的发送 4.通过串口向电脑发送ok字符 5.封装发送字符串函数 6.重定向printf串口发送 7.串口输入控制LED灯开关 遇到的问题 1.串口 ...
- 串口发送接收浮点型数据
转自:https://blog.csdn.net/liangwei88624/article/details/6885803 转自:https://blog.csdn.net/newstoy/arti ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/private void SerialPort_DataReceived( ...
- 51单片机模拟串口发送接收数据(不使用SBUF)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 51单片机.模拟串口.串口发送.串口接收.逻辑分析仪 前言 一.配置定时器 二.串口发送 三.串口接收 四.主函数 五.波形图 5.1 ...
- GPIO口模拟串口发送接收(基于H861)
以前常听说码农需要有严密的逻辑思维,以前不明白.没有思维框架,真的很难写代码,不能瞎蒙,等我的只是效率低下 思路 首先我们要模拟串口通信,就要了解通信的必须条件,包括数据位及其他标志位,以及他的时序, ...
- C#利用SerialPort类对串口发送接收数据
1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...
- 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!
戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...
- STM32串口的使用(原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯)
参考:串口的结构体 重定向printf串口发送stm32等博文 作者:点灯小哥 发布时间: 2021-03-06 21:46:33 网址:https://blog.csdn.net/weixin_46 ...
最新文章
- CentOS Linux 7 配置 nginx 支持 CGI
- R语言ggplot2可视化:可视化分组的小提琴图(violin plot)并在分组小提琴内部嵌入箱图(box plot)
- Linux 查看负载
- Python地信专题 | 基于geopandas玩转地图可视化
- Linux查找文件命令find .
- list容器java_【Java容器】List容器使用方法及源码分析
- 【并查集】Supermarket(poj 1456/luogu-UVA1316)
- UML中的用例间关系图示
- 6.表单提交,input键盘变搜索,有关自定义属性input操作
- Android计算器效果截图,Android复杂计算器实现
- 用c语言算法统宗 李白沽酒,趣味数学题:百羊问题与李白沽酒
- 视频教程-【深入理解计算机网络】讲师解读计算机网络原理视频课程(上)-计算机网络
- 如何用PowerPoint压缩ppt文件大小
- Lintcode:报数
- Swing游戏开发——飞机大战
- 土地利用规划之平时作业二
- python 银行数据_Kmeans 银行数据聚类分析
- STM32系统时钟树分析
- Android基于卷积神经网络的数字手势识别识别数字手势0-10 Android studio编译
- 关注MSN聊天机器人颁奖典礼(转)