c++串口操作
0. 前言
做串口方面的程序,使用CreateFile打開串口通信端口。在對串口操作之前,需要首先打開串口。使用C++進(jìn)行串口編程,如果采用VS開發(fā),則可以直接借助于串口通信控件來操作,其次,直接調(diào)用Windows的底層API函數(shù)來控制串口通信。
在Window 32bit 的操作系統(tǒng)上, 將串口(通信設(shè)備)作為文件來處理,所以串口的打開、關(guān)閉、讀寫所使用的API函數(shù)與文件操作一樣。所以打開串口使用CreateFile函數(shù),讀寫串口使用ReadFile、WriteFile,函數(shù)。關(guān)閉串口使用CloseHandle函數(shù)。
?
1. 查看通信串口設(shè)備,可以在設(shè)備管理器中查看;
2.
?
?
-------------------------------
1. CreateFile
這個函數(shù)的功能是創(chuàng)建或者打開一個文件或者I/O設(shè)備,通常使用的I/O形式有文件、文件流、目錄、物理磁盤、卷、終端流等。如執(zhí)行成功,則返回文件句柄。 INVALID_HANDLE_VALUE 表示出錯,會設(shè)置 GetLastError 。?
函數(shù)的聲明定義:
參數(shù)列表:
?
部分參數(shù)Tips:
1. lpFileName:指定要打開的串口邏輯名,用字符串來表示。如COM1, COM2,分別表示串口1,和串口2.
如果要確定工控機(jī)上有那些串口,可以使用設(shè)備管理器查看。如下圖:
查看方式如下圖:我的電腦,右鍵, 開發(fā)“設(shè)備管理器”即可。
? 2. dwDesiredAccess:端口屬性的訪問類型,
3.? dwShareMode:指定端口的共享屬性。
該參數(shù)是由那些應(yīng)用程序共享的文件提供。對于串口來說,是不能共享的,因此,必須設(shè)置為0,這是通信設(shè)備與文件的特殊差別。
如果當(dāng)前的應(yīng)用程序調(diào)用CreateFile打開一個串口,另外一個程序如果已經(jīng)打開了該串口,此時CreateFile會返回一個錯誤代碼。
然而,同一個應(yīng)用程序的多個線程是可以共享CreateFile返回的端口句柄。并且根據(jù)安全屬性設(shè)置,該句柄可以打開端口的應(yīng)用程序的子程序來繼承。
4. lpSecurityAttributes:安全屬性,一般該參數(shù)為NULL,即該端口被設(shè)置為缺省的安全屬性。缺省安全屬性下,端口的句柄是不能繼承的。
5. dwCreationDisposition:指定此端口正在被其他程序占用采取的動作,因?yàn)榇诳偸谴嬖诘?#xff0c;因此必須設(shè)置為OPEN_EXISTing, 該標(biāo)志高速Windows不要創(chuàng)建新的端口。而是打開一個已經(jīng)存在的端口。
, 6. dwFlagsAndSttributes:描述了端口的各種屬性,對于文件來說有很多屬性,但是對于串口來說,唯一的意義是FILE_FLAG _OVERLAPPED 屬性,當(dāng)設(shè)置該屬性時,端口IO可以在后臺進(jìn)行,稱為異步IO重疊結(jié)構(gòu)。
7. hTemplateFile: 指定模板的文件句柄,對于串口來說,此參數(shù)必須設(shè)置為0;
關(guān)閉串口
關(guān)閉串口,使用CloseHandle,函數(shù)聲明為:
函數(shù)很簡單,參數(shù)是使用CreateFile打開的端口句柄。調(diào)用這個函數(shù)可以實(shí)現(xiàn)串口關(guān)閉。
? 示例如下:
?
?
2. ReadFile
從文件指針指向的位置(設(shè)備文件,通信)開始將數(shù)據(jù)讀出到一個文件中, 且支持同步和異步操作,如果文件打開方式?jīng)]有指明FILE_FLAG_OVERLAPPED的話,當(dāng)程序調(diào)用成功時,它將實(shí)際讀出文件的字節(jié)數(shù)保存到lpNumberOfBytesRead指明的地址空間中。FILE_FLAG_OVERLAPPED 允許對文件進(jìn)行重疊操作。?
函數(shù)聲明定義:
代碼示例:、
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 // 創(chuàng)建設(shè)備文件,返回文件的位置 15 if ( pFile == INVALID_HANDLE_VALUE) 16 { 17 printf("open file error!\n"); 18 CloseHandle(pFile); 19 return FALSE; 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{ //循環(huán)讀文件,確保讀出完整的文件 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 處理讀到的數(shù)據(jù) buffer 43 44 free(buffer); 45 CloseHandle(pFile); 46 47 return TRUE; 48 }3. WriteFile
將數(shù)據(jù)寫入一個文件(設(shè)備文件,通信)。該函數(shù)比fwrite函數(shù)要靈活的多。也可將這個函數(shù)應(yīng)用于對通信設(shè)備、管道、套接字以及郵槽的處理。返回時,TRUE(非零)表示成功,否則返回零。會設(shè)置GetLastError。?
函數(shù)聲明定義:
示例代碼:
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, //總是創(chuàng)建文件 11 FILE_ATTRIBUTE_NORMAL, 12 NULL); 13 14 if ( pFile == INVALID_HANDLE_VALUE) 15 { 16 printf("create file error!\n"); 17 CloseHandle(pFile); 18 return FALSE; 19 } 20 21 dwBytesToWrite = contentLen; 22 dwBytesWrite = 0; 23 24 tmpBuf = buffer; 25 26 do{ //循環(huán)寫文件,確保完整的文件被寫入 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 return TRUE; 38 }總結(jié)
- 上一篇: C#调用C++函数来与串口通信
- 下一篇: 比较全的C语言面试题