在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系类异步、并行(同一个串口发送接收)相关推荐

  1. STM32—USART串口发送+接收

    STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...

  2. STM32串口发送接收数据

    目录 1.串口通信 2.串口的结构体 3.如何配置串口的发送 4.通过串口向电脑发送ok字符 5.封装发送字符串函数 6.重定向printf串口发送 7.串口输入控制LED灯开关 遇到的问题 1.串口 ...

  3. 串口发送接收浮点型数据

    转自:https://blog.csdn.net/liangwei88624/article/details/6885803 转自:https://blog.csdn.net/newstoy/arti ...

  4. c# 串口发送接收数据

    /********************** 串口数据接收事件 *****************************/private void SerialPort_DataReceived( ...

  5. 51单片机模拟串口发送接收数据(不使用SBUF)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 51单片机.模拟串口.串口发送.串口接收.逻辑分析仪 前言 一.配置定时器 二.串口发送 三.串口接收 四.主函数 五.波形图 5.1 ...

  6. GPIO口模拟串口发送接收(基于H861)

    以前常听说码农需要有严密的逻辑思维,以前不明白.没有思维框架,真的很难写代码,不能瞎蒙,等我的只是效率低下 思路 首先我们要模拟串口通信,就要了解通信的必须条件,包括数据位及其他标志位,以及他的时序, ...

  7. C#利用SerialPort类对串口发送接收数据

    1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...

  8. 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!

    戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...

  9. STM32串口的使用(原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯)

    参考:串口的结构体 重定向printf串口发送stm32等博文 作者:点灯小哥 发布时间: 2021-03-06 21:46:33 网址:https://blog.csdn.net/weixin_46 ...

最新文章

  1. CentOS Linux 7 配置 nginx 支持 CGI
  2. R语言ggplot2可视化:可视化分组的小提琴图(violin plot)并在分组小提琴内部嵌入箱图(box plot)
  3. Linux 查看负载
  4. Python地信专题 | 基于geopandas玩转地图可视化
  5. Linux查找文件命令find .
  6. list容器java_【Java容器】List容器使用方法及源码分析
  7. 【并查集】Supermarket(poj 1456/luogu-UVA1316)
  8. UML中的用例间关系图示
  9. 6.表单提交,input键盘变搜索,有关自定义属性input操作
  10. Android计算器效果截图,Android复杂计算器实现
  11. 用c语言算法统宗 李白沽酒,趣味数学题:百羊问题与李白沽酒
  12. 视频教程-【深入理解计算机网络】讲师解读计算机网络原理视频课程(上)-计算机网络
  13. 如何用PowerPoint压缩ppt文件大小
  14. Lintcode:报数
  15. Swing游戏开发——飞机大战
  16. 土地利用规划之平时作业二
  17. python 银行数据_Kmeans 银行数据聚类分析
  18. STM32系统时钟树分析
  19. Android基于卷积神经网络的数字手势识别识别数字手势0-10 Android studio编译
  20. 关注MSN聊天机器人颁奖典礼(转)

热门文章

  1. 卧槽!两大抓包神器的视频教程来啦!
  2. 新款iPad,抱回家!
  3. Jack Dorsey二度卸任推特CEO,原CTO接棒,立即生效!
  4. 资深架构师手把手教你性能优化
  5. 数据仓库之电商数仓-- 4、可视化报表Superset
  6. react让我怀疑自己没有当程序员的天分怎么破?
  7. Kafka Producer 发送消息源码阅读
  8. Python中dataframe数据框中选择某一列非空的行
  9. Win2008 R2 VDI动手实验系列之一:Active Directory搭建
  10. 真实的金陵十三钗:15名传教士的爱与泪