當前位置:首頁 » 編程軟體 » 串口api編程

串口api編程

發布時間: 2023-05-08 12:32:52

⑴ VC串口API編程:串口緩沖區是什麼樣子的為什麼我用PurgeComm清空後用ReadFile還能讀到以前的數據

不能。
第一次讀取5個位元組。
第二次才能讀取到。

⑵ 如何用API函數實現WINDOWS下的串口寫程

用API函數實現Windows下的串列通訊
馮華亮 2002年4月 四川·電子科大
以往的DOS系統是通過DOS中斷和BIOS中斷向用戶提供串列介面的通訊能力。在Windows環境下,C++的開發工具既沒有提供象DOS和BIOS
中那樣專門的串列通訊控制方法,也不允許用戶直接控制串口的中斷。
為了保證資源共享,Windows系統完全接管了各種硬體資源,使用中斷來控制埠將破壞系統的多任務性,使系統的穩定性受到影響。
但Windows同時也提供了功能強大的API函數使用戶能間接的控制串列通訊。
1、實現串列通訊的相關API函數
API函數不僅提供了打開和讀寫通訊埠的操作方法,還提供了名目繁多的函數以支持對串列通訊的各種操作。常用函數及作用如表廳塌5-1所示。
表5-1 常用串列通訊API函數及其作用
函數名 作用
CreateFile 打開串口
GetCommState 檢測串口設置
SetCommState 設置串口
BuilderCommDCB 用字元串中的值來填充設備控制塊
GetCommTimeouts 檢測通信超時設置
SetCommTimeouts 設置通信超時參數
SetCommMask 設定被監控事件
WaitCommEvent 等待被監控事件發生
WaitForMultipleObjects 等待多個被監測對象的結果
WriteFile 發送數據
ReadFile 接收數據
GetOverlappedResult 返回最後重疊(非同步)操作結果
PurgeComm 清空串口緩沖區,退出所有相關操作
ClearCommError 更新串口狀態結構體,並清除所有串口硬體錯誤
CloseHandle 關閉串列口
2、打開串口
函數CreateFile原本用於打開文件,但它同樣可用於打開一個通信埠。與系統中其他對象一樣,通信埠也是用句柄來標識的。
CreateFile函數返回被操作的通信埠句柄,其調用方法如下:
HANDLE CreateFile (
LPCTSTR lpFileName, //指向文件名字元串的指針
DWORD dwDesireAccess, //操作模式
DWORD dwShareMode, //共享方式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全屬性的指針
DWORD dwCreationDistribution, //文件建立方式
DWORD dwFlagsAndAttributes //文件屬性
HANDLE hTemplateFile //模板文件句柄
)
lpFileName:指向一個以NULL結束的字元串,該串指定了要創建、打開或截斷的文件、管道、通信源、磁碟設備或控制台的名字。
當用CreateFile打開串口時,這個參數可用「COM1」指定串口1,用「COM2」指定串口2,依此類推。
dwDesireAccess: 指定對文件訪問的類型,該參數可以為GENERIC_READ(指定豎並對該文件的讀訪問權)
或ENERIC_WRITE(指定該文件的寫訪問權)兩個值之一或同時為為這兩個值。用ENERIC_READ|GENERIC_WRITE則指定可對串口進行讀寫;
dwShareMode:指定此文件可以怎樣被共享。因為串列口不支持任何共享模式,所以dwShareMode必須設為0;
lpSecurityAttributes定義安全屬性,一般不用,可設為NULL。Win 9x下該參數被忽略;
dwCreationDistribution定義文件創建方式, 對串口必須設為OPEN_EXISTING,表示打開已經存在的文件;
dwFlagsAndAttributes為該文件指定定義文件屬性和標志,這個程序中設為FILE_FLAG_OVERLAPPED,表示非同步通信方式;
hTemplateFile 指向一個模板文件的句柄,串口無模板可言,設為NULL。在 Windows 9x下該參數必須為NULL。
用非同步讀寫扮纖圓方式打開串口1的函數調用如下:
m_hComm = CreateFile(「COM1」, //打開串口1
GENERIC_READ | GENERIC_WRITE, //讀寫方式
0, //不能共享
NULL, //不用安全結構
OPEN_EXISTING, //打開已存在的設備
FILE_FLAG_OVERLAPPED, //非同步方式
0); //無模板
串口被成功打開時,返回其句柄,否則返回INVALID_HANDLE_VALUE(0XFFFFFFFF)。
3、串口設置
第一次打開串口時,串口設置為系統默認值,函數GetCommState和SetCommState可用於檢索和設定埠設置的DCB(設備控制塊)結構,
該結構中BaudRate、ByteSize、StopBits和Parity欄位含有串口波特率、數據位數、停止位和奇偶校驗控制等信息。
程序中可先用GetCommState檢索埠的當前設置,修改其中的部分欄位後再用SetCommState進行埠設定。這樣可不必構造一個完整的DCB結構。
下面介紹幾個主要的函數和結構體:
(1)GetCommState
BOOL GetCommState( hCommDev, lpdcb);
參數hCommDev標識通信設備,應使用CreateFile返回的句柄。Lpdcb是指向DCB結構的指針,
函數調用後當前串口配置信息將被保存在這個結構內。如果函數成功返回值為TRUE;否則返回值為FALSE。
SetCommState用法與GetCommState相似,在此不再重復。DCB結構定義如下(只介紹主要的幾項):
typedef struct _ DCB{
……
DWORD BardRate; //波特率的設置
BYTE ByteSize; //數據位的個數
BYTE Parity; //是否有奇偶校驗位
BYTE StopBits; //停止位的個數
……
}DCB;
(2)SetCommTimeouts
BOOL SetCommTimeouts( hCommDev, lpctmo );
Lpctmo指向包含新的超時參數的COMMTIMEOUTS結構。COMMTIMEOUTS結構定義如下:
typedef struct _ COMMTIMEOUTS{
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutconstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutconstant;
}COMMTIMEOUTS, LPCOMMTIMEOUTS;
ReadIntervalTimeout: 以毫秒為單位指定通信線上兩個字元到達之間的最大時間。在ReadFile操作其間,
收到第一個字元時開始計算時間。若任意兩個字元到達之間的間隔超過這個最大值,ReadFile操作完成,
返回緩沖數據。0值表示不用間隔限時。若該成員為MAXDWORD,且ReadTotalTimeoutconstant和
ReadTotalTimeoutMultiplier成員為零,則指出讀操作要立即返回已接收到的字元,即使未收到字元,
讀操作也要返回。
ReadTotalTimeoutMultiplier:以毫秒為單位指定一個乘數,該乘數用來計算讀操作的總限時時間。每個讀操作的總限時時間等於讀操作所需的位元組數與該值的乘積。
ReadTotalTimeoutConstant:以毫秒為單位指定一個常數,用於計算讀操作的總限時時間。每個操作的總限時時間等於ReadTotalTimeoutMultiplier成員乘以讀操作所需位元組數再加上該值的和。ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant成員的值為0表示讀操作不使用限時時間。
WriteTotalTimeoutMultiplier和WriteTotalTimeoutconstant的意義和作用分別與ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant相似,不再重復。
(3)BuilderCommDCB
BOOL BuilderCommDCB(lpszDef,lpdcb)
這個函數按lpszDef字元串所指定的格式來配置串口的DCB。
LpszDef:指向一個以NULL結束的字元串,該字元串指定串口的控制信息。比如,「1200,N,8,1」指定波特率為1200,無奇偶校驗位,有8個數據位和1個停止位。
lpdcb:指向被填充的DCB結構。
(4)SetCommMask
BOOL SetCommMask(hCommDev,fdwEvtMask);
fdwEvtMask指向一個32位的屏蔽碼,如果指定為EV_RXCHAR | EV_CTS,表示程序監控串口的收、發事件。
下面以簡單的例子說明串口設置的步驟:
m_CommTimeouts.ReadIntervalTimeout = 1000;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
if (SetCommTimeouts(m_hComm, &m_CommTimeouts))
// 串口超時參數設置
if (SetCommMask(m_hComm, dwCommEvents))
// 設置串口事件掩碼
if (GetCommState(m_hComm, &m_dcb))
// 獲取串口當前狀態
if (BuildCommDCB(「1200,N,8,1」, &m_dcb))
// 建立串口設備控制塊
if (SetCommState(m_hComm, &m_dcb));
// 設置串口參數
……
以上任何一個if語句的判斷條件為假時都將調用GetLastError函數獲取錯誤信息,進行錯誤處理。
4、讀寫串口數據

⑶ 如何用API的方法操作串口

1、 打開串口
在《VC 打開串口》一文中我們已經單螞困獨介哪物此紹李迅過如果利用API打開串口的方法,打開串口是用API函數CreateFile來打開或創建的。該函數的原型為:
HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);

⑷ 請教關於串口流控制的過程,以及在API編程中怎麼使用有關問題

一般這樣使用:敬裂
C/C++ code //流控制設置
switch ( m_nFlowCtrl )
{ // Judge flow control
case IdFlowX:
/*--------軟體流控制方式---------------*/
dcb.fOutX = TRUE; // XON/XOFF out flow control
dcb.fInX = TRUE; // XON/XOFF in flow control
dcb.XonLim = CommXonLim; // transmit XON threshold
dcb.XoffLim = CommXoffLim; // transmit XOFF threshold
dcb.XonChar = XON; // Tx and Rx XON character
dcb.XoffChar = XOFF; // Tx and Rx XOFF character
/*-------------------------------------*/
break;
case IdFlowHard:
/*--------硬體流拿洞控消稿枯制方式---------------*/

dcb.fDtrControl = CommXDtrControl;

dcb.fOutxCtsFlow = m_nFlowCtrl==1; // CTS output flow control
dcb.fRtsControl = CommXRtsControl; // RTS output flow control

/*--------------------------------------*/
break;

}

⑸ 怎麼用MFC使用API函數來做串口通信

示例,僅供參考:

//1.打開串列通信口,保存串口句柄hCom=CreateFile("////.//COM10",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hCom==(HANDLE)INVALID_FILE_SIZE){
MessageBox("埠無法打開");
return;}if(hCom!=INVALID_HANDLE_VALUE){//設置埠SetupComm(hCom,OUT_BUFF_SIZE,IN_BUFF_SIZE);DCBmyDCB;GetCommState(hCom,&myDCB);myDCB.BaudRate=57600;//波特率myDCB.fBinary=TRUE;//通信方式=二進制myDCB.fParity=TRUE;//奇偶校驗TRUE=使用,FALSE=不使用myDCB.Parity=1;//校驗方式:0-無1-奇2-偶3-標志4-空格myDCB.ByteSize=8;//數據位數myDCB.StopBits=1;//停枯陪止位數:0-1位1-1.5位2-2位SetCommState(hCom,&myDCB);}else{
MessageBox("埠無法打開"沒世蠢);
return;}//2.發送數據WriteFile(hCom,&datas,Len,NULL,NULL);//3.讀緩沖區並處理收到的數據ReadFile(hCom,&myByte,Len,返拍NULL,NULL);
熱點內容
如何把手機改安卓10 發布:2024-05-05 17:39:07 瀏覽:496
我的世界怎麼擴容伺服器內存 發布:2024-05-05 17:19:54 瀏覽:48
java讀取文件字元 發布:2024-05-05 17:15:18 瀏覽:11
三星怎麼應用加密 發布:2024-05-05 17:13:18 瀏覽:152
cad字體在那個文件夾 發布:2024-05-05 17:08:20 瀏覽:331
什麼時候用編譯器 發布:2024-05-05 17:08:20 瀏覽:766
應急救援腳本 發布:2024-05-05 17:08:17 瀏覽:338
我的世界搭建無正版驗證伺服器 發布:2024-05-05 17:03:48 瀏覽:819
我的世界伺服器地址寶可夢 發布:2024-05-05 17:00:16 瀏覽:256
dede企業源碼 發布:2024-05-05 16:57:53 瀏覽:787