c++ to create html file,C/C++ 文件操作之CreateFile、ReadFile和WriteFile(示例代码)

通常使用下列函数来通过Win系统来对外围设备进行通信处理:

0. 前言

做串口方面的程序,使用CreateFile打开串口通信端口。在对串口操作之前,需要首先打开串口。使用C++进行串口编程,如果采用VS开发,则可以直接借助于串口通信控件来操作,其次,直接调用Windows的底层API函数来控制串口通信。

在Window 32bit 的操作系统上, 将串口(通信设备)作为文件来处理,所以串口的打开、关闭、读写所使用的API函数与文件操作一样。所以打开串口使用CreateFile函数,读写串口使用ReadFile、WriteFile,函数。关闭串口使用CloseHandle函数。

1. 查看通信串口设备,可以在设备管理器中查看;

2.

-------------------------------

1. CreateFile

这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。

函数的声明定义:

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

);

参数列表:

e1cc891f21fc4a99a83594935cee5640.jpg

部分参数Tips:

1. lpFileName:指定要打开的串口逻辑名,用字符串来表示。如COM1, COM2,分别表示串口1,和串口2.

如果要确定工控机上有那些串口,可以使用设备管理器查看。如下图:

0f3843c5416944c3a3765aaf67813de6.jpg

查看方式如下图:我的电脑,右键, 开发“设备管理器”即可。

88148b87e38342ce9c0c5f9ae21dd16f.jpg

2. dwDesiredAccess:端口属性的访问类型,

3.  dwShareMode:指定端口的共享属性。

该参数是由那些应用程序共享的文件提供。对于串口来说,是不能共享的,因此,必须设置为0,这是通信设备与文件的特殊差别。

如果当前的应用程序调用CreateFile打开一个串口,另外一个程序如果已经打开了该串口,此时CreateFile会返回一个错误代码。

然而,同一个应用程序的多个线程是可以共享CreateFile返回的端口句柄。并且根据安全属性设置,该句柄可以打开端口的应用程序的子程序来继承。

4. lpSecurityAttributes:安全属性,一般该参数为NULL,即该端口被设置为缺省的安全属性。缺省安全属性下,端口的句柄是不能继承的。

5. dwCreationDisposition:指定此端口正在被其他程序占用采取的动作,因为串口总是存在的,因此必须设置为OPEN_EXISTing, 该标志高速Windows不要创建新的端口。而是打开一个已经存在的端口。

,  6. dwFlagsAndSttributes:描述了端口的各种属性,对于文件来说有很多属性,但是对于串口来说,唯一的意义是FILE_FLAG _OVERLAPPED 属性,当设置该属性时,端口IO可以在后台进行,称为异步IO重叠结构。

7. hTemplateFile: 指定模板的文件句柄,对于串口来说,此参数必须设置为0;

1f8d42f976b444e1afc6687edfcf0459.jpg

关闭串口

关闭串口,使用CloseHandle,函数声明为:

09d312b9ea19480696f6c4c5b02400f0.jpg

函数很简单,参数是使用CreateFile打开的端口句柄。调用这个函数可以实现串口关闭。

示例如下:

953a89d588874a0b8495abfa5f6d3838.jpg

2. ReadFile

从文件指针指向的位置(设备文件,通信)开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作。

函数声明定义:

BOOL WINAPI ReadFile(

__in HANDLE hFile,//文件句柄

__out LPVOID lpBuffer, //接收数据用的 buffer

__in DWORD nNumberOfBytesToRead, //要读取的字节数

__out LPDWORD lpNumberOfBytesRead, //实际读取到的字节数

__in LPOVERLAPPED lpOverlapped //OVERLAPPED 结构,一般设定为 NULL

);

代码示例:、

1 BOOL Read(char *filePath)2 {3 HANDLE pFile;4 DWORD fileSize;5 char *buffer,*tmpBuf;6 DWORD dwBytesRead,dwBytesToRead,tmpLen;7

8 pFile =CreateFile(filePath,GENERIC_READ,9 FILE_SHARE_READ,10 NULL,11 OPEN_EXISTING, //打开已存在的文件

12 FILE_ATTRIBUTE_NORMAL,13 NULL);14   // 创建设备文件,返回文件的位置

15 if ( pFile ==INVALID_HANDLE_VALUE)16 {17 printf("open file error!\\n");18 CloseHandle(pFile);19 returnFALSE;20 }21

22 fileSize = GetFileSize(pFile,NULL); //得到文件的大小

23

24 buffer = (char *) malloc(fileSize);25 ZeroMemory(buffer,fileSize);26 dwBytesToRead =fileSize;27 dwBytesRead = 0;28 tmpBuf =buffer;29

30 do{ //循环读文件,确保读出完整的文件

31

32 ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);33

34 if (dwBytesRead == 0)35 break;36

37 dwBytesToRead -=dwBytesRead;38 tmpBuf +=dwBytesRead;39

40 } while (dwBytesToRead > 0);41

42 //TODO 处理读到的数据 buffer

43

44 free(buffer);45 CloseHandle(pFile);46

47 returnTRUE;48 }

3. WriteFile

将数据写入一个文件(设备文件,通信)。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE(非零)表示成功,否则返回零。会设置GetLastError。

函数声明定义:

BOOL WINAPI WriteFile(

__in HANDLE hFile,//文件句柄

__in LPCVOID lpBuffer, //要写入的数据

__in DWORD nNumberOfBytesToWrite, //要写入的字节数

__out LPDWORD lpNumberOfBytesWritten, //实际写入的字节数

__in LPOVERLAPPED lpOverlapped //OVERLAPPED 结构,一般设定为 NULL

);

示例代码:

1 BOOL Write(char *buffer, DWORD contentLen)2 {3 HANDLE pFile;4 char *tmpBuf;5 DWORD dwBytesWrite,dwBytesToWrite;6

7 pFile =CreateFile(filePath,GENERIC_WRITE,8 0,9 NULL,10 CREATE_ALWAYS, //总是创建文件

11 FILE_ATTRIBUTE_NORMAL,12 NULL);13

14 if ( pFile ==INVALID_HANDLE_VALUE)15 {16 printf("create file error!\\n");17 CloseHandle(pFile);18 returnFALSE;19 }20

21 dwBytesToWrite =contentLen;22 dwBytesWrite = 0;23

24 tmpBuf =buffer;25

26 do{ //循环写文件,确保完整的文件被写入

27

28 WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);29

30 dwBytesToWrite -=dwBytesWrite;31 tmpBuf +=dwBytesWrite;32

33 } while (dwBytesToWrite > 0);34

35 CloseHandle(pFile);36

37 returnTRUE;38 }

参考博客:

打开Usb

endl;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值