一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務 - 聯(lián)系電話:
您的當前位置: > 關注 > > 正文

天天微頭條丨用VC6.0實現(xiàn)上位機串口通信

來源:CSDN 時間:2022-12-08 15:17:00

串口是常用的計算機與外部串行設備之間的數(shù)據(jù)傳輸通道,由于串行通信方便易行,所以應用廣泛。我們可以利用Windows API 提供的通信函數(shù)編寫出高可移植性的串行通信程序。本實例介紹在Visual C++6.0下如何利用Win32 API 實現(xiàn)串行通信程序。程序編譯運行后的界面效果如圖一所示:

一、實現(xiàn)方法在Win16中,可以利用OpenComm()、CloseComm()和WriteComm()等函數(shù)打開、關閉和讀寫串口。但在Win32中,串口和其他通信設備均被作為文件處理,串口的打開、關閉和讀寫等操作所用的API函數(shù)與操作文件的函數(shù)相同。可通過CreateFile()函數(shù)打開串口;通過CloseFile()函數(shù)關閉串口;通過DCB結(jié)構(gòu)、CommProp()、GetCommProperties()、SetCommProperties()、GetCommState()及SetCommState()等函數(shù)設置串口狀態(tài),通過函數(shù)ReadFile()和WritFile()等函數(shù)讀寫串口。下面來詳細介紹其實現(xiàn)原理。

對于串行通信設備,Win32 API支持同步和異步兩種I/O操作。同步操作方式的程序設計相對比較簡單,但I/O操作函數(shù)在I/O操作結(jié)束前不能返回,這將掛起調(diào)用線程,直到I/O操作結(jié)束。異步操作方式相對要復雜一些,但它可讓耗時的I/O操作在后臺進行,不會掛起調(diào)用線程,這在大數(shù)據(jù)量通信的情況下對改善調(diào)用線程的響應速度是相當有效的。異步操作方式特別適合同時對多個串行設備進行I/O操作和同時對一個串行設備進行讀/寫操作。


【資料圖】

串行設備的初始化

串行設備的初始化是利用CreateFile()函數(shù)實現(xiàn)的。該函數(shù)獲得串行設備句柄并對其進行通信參數(shù)設置,包括設置輸出/接收緩沖區(qū)大小、超時控制和事件監(jiān)視等。 例如下面的代碼實現(xiàn)了串口的初始化:

//串行設備句柄; HANDLE hComDev=0; //串口打開標志; BOOL bOpen=FALSE; //線程同步事件句柄; HANDLE hEvent=0; DCB dcb; COMMTIMEOUTS timeouts; //設備已打開 if(bOpen) return FALSE;  //打開COM1 if((hComDev=CreateFile(“COM1”,GENERICREAD|GENERICWRITE,0,NULL,OPENEXISTING,FILEATTRIBUTENORMAL,NULL))==INVALIDHANDLEVALUE)

return FALSE; //設置超時控制 SetCommTimeouts(hComDev,&timeouts); //設置接收緩沖區(qū)和輸出緩沖區(qū)的大小 SetupComm(hComDev,1024,512); //獲取缺省的DCB結(jié)構(gòu)的值 GetCommState(hComDev,&dcb); //設定波特率為9600 bps  dcb.BaudRate=CBR9600; //設定無奇偶校驗  dcb.fParity=NOPARITY; //設定數(shù)據(jù)位為8  dcb.ByteSize=8;  //設定一個停止位  dcb.StopBits=ONESTOPBIT; //監(jiān)視串口的錯誤和接收到字符兩種事件  SetCommMask(hComDev,EVERR|EVRXCHAR); //設置串行設備控制參數(shù)  SetCommState(hComDev,&dcb); //設備已打開  bOpen=TRUE;  //創(chuàng)建人工重設、未發(fā)信號的事件  hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”); //創(chuàng)建一個事件監(jiān)視線程來監(jiān)視串口事件  AfxBeginThread(CommWatchProc,pParam); }

在設置串口DCB結(jié)構(gòu)的參數(shù)時,不必設置每一個值。首先讀出DCB缺省的參數(shù)設置,然后只修改必要的參數(shù),其他參數(shù)都取缺省值。由于對串口進行的是同步I/O操作,所以除非指定進行監(jiān)測的事件發(fā)生,否則WaitCommEvent()函數(shù)不會返回。在串行設備初始化的最后要建立一個單獨的監(jiān)視線程來監(jiān)視串口事件,以免掛起當前調(diào)用線程,其中pParam可以是一個對事件進行處理的窗口類指針。

如果要進行異步I/O操作,打開設備句柄時,CreateFile的第6個參數(shù)應增加FILEFLAGOVERLAPPED 標志。

數(shù)據(jù)發(fā)送

數(shù)據(jù)發(fā)送利用WriteFile()函數(shù)實現(xiàn)。對于同步I/O操作,它的最后一個參數(shù)可為NULL;而對異步I/O操作,它的最后一個參數(shù)必需是一個指向OVERLAPPED結(jié)構(gòu)的指針,通過OVERLAPPED結(jié)構(gòu)來獲得當前的操作狀態(tài)。

BOOL WriteComm(LPCVOID lpSndBuffer,DWORD dwBytesToWrite) { //lpSndBuffer為發(fā)送數(shù)據(jù)緩沖區(qū)指針,  dwBytesToWrite為將要發(fā)送的字節(jié)長度  //設備已打開  BOOL bWriteState;  //實際發(fā)送的字節(jié)數(shù)  DWORD dwBytesWritten;  //設備未打開  if(!bOpen) return FALSE;  bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,&dwBytesWritten,NULL); if(!bWriteState || dwBytesToWrite!=dwBytesWritten)

//發(fā)送失敗

return FALSE;  else

//發(fā)送成功

return TRUE; }

數(shù)據(jù)接收

接收數(shù)據(jù)的任務由ReadFile函數(shù)完成。該函數(shù)從串口接收緩沖區(qū)中讀取數(shù)據(jù),讀取數(shù)據(jù)前,先用ClearCommError函數(shù)獲得接收緩沖區(qū)中的字節(jié)數(shù)。接收數(shù)據(jù)時,同步和異步讀取的差別同發(fā)送數(shù)據(jù)是一樣的。

DWORD ReadComm(LPVOID lpInBuffer,DWORD dwBytesToRead) { //lpInBuffer為接收數(shù)據(jù)的緩沖區(qū)指針, dwBytesToRead為準備讀取的數(shù)據(jù)長度(字節(jié)數(shù))  //串行設備狀態(tài)結(jié)構(gòu)  COMSTAT ComStat;  DWORD dwBytesRead,dwErrorFlags;   //設備未打開  if(!bOpen) return 0;  //讀取串行設備的當前狀態(tài)  ClearCommError(hComDev,&dwErrorFlags,&ComStat);  //應該讀取的數(shù)據(jù)長度  dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);  if(dwBytesRead>0)

//讀取數(shù)據(jù)

if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,&dwBytesRead,NULL))

dwBytesRead=0;  return dwBytesRead; }

事件監(jiān)視線程

事件監(jiān)視線程對串口事件進行監(jiān)視,當監(jiān)視的事件發(fā)生時,監(jiān)視線程可將這個事件發(fā)送(SendMessage)或登記(PostMessage)到對事件進行處理的窗口類(由pParam指定)中。

UINT CommWatchProc(LPVOID pParam) { DWORD dwEventMask=0; //發(fā)生的事件;  while(bOpen)  {

//等待監(jiān)視的事件發(fā)生

WaitCommEvent(hComDev, &dwEventMask,NULL);

if ((dwEventMask & EVRXCHAR)==EVRXCHAR)

……//接收到字符事件后,可以將此消息登記到由pParam有指定的窗口類中進行處理

if(dwEventMask & EVERR)==EVERROR)

……//發(fā)生錯誤時的處理  }  SetEvent(hEvent);  //發(fā)信號,指示監(jiān)視線程結(jié)束  return 0; }

關閉串行設備

在整個應用程序結(jié)束或不再使用串行設備時,應將串行設備關閉,包括取消事件監(jiān)視,將設備打開標志bOpen置為FALSE以使事件監(jiān)視線程結(jié)束,清除發(fā)送/接收緩沖區(qū)和關閉設備句柄。

void CloseSynComm() {  if(!bOpen) return;  //結(jié)束事件監(jiān)視線程  bOpen=FALSE;  SetCommMask(hComDev,0);  //取消事件監(jiān)視,此時監(jiān)視線程中的WaitCommEvent將返回  WaitForSingleObject(hEvent,INFINITE);  //等待監(jiān)視線程結(jié)束  CloseHandle(hEvent); //關閉事件句柄  //停止發(fā)送和接收數(shù)據(jù),并清除發(fā)送和接收緩沖區(qū)  PurgeComm(hComDev,PURGETXABORT| PURGERXABORT|PURGETXCLEAR|PURGERXCLEAR);  //關閉設備句柄  CloseHandle(hComDev); }

二、編程步驟1、 啟動Visual C++6.0,生成一個基于對話框的的應用程序,將該程序命名為“SerealCom”;

2、 按照圖一的界面設計對話框,具體設置參見代碼部分;

3、 使用Class Wizard為對話框的按鈕添加鼠標單擊消息響應函數(shù);

4、 添加代碼,編譯運行程序。

1 #if !defined(_COMM_ACCESS_FUNCTIONS_AND_DATA)  2 #define _COMM_ACCESS_FUNCTIONS_AND_DATA  3 #if _MSC_VER > 1000  4 #pragma once  5 #endif // _MSC_VER > 1000  6 #define EVENTCHAR 0x0d  7 #define MAXBLOCKLENGTH 59  8   9 extern BYTE XwCom; 10 extern BYTE sCom1[5],sCom2[MAXBLOCKLENGTH+12]; 11 extern sCom3[MAXBLOCKLENGTH+12]; 12 extern BYTE opation; 13 extern short ComNum; 14  15 #define FC_DTRDSR 0x01 16 #define FC_RTSCTS 0x02 17 #define FC_XONXOFF 0x04 18 #define ASCII_BEL 0x07 19 #define ASCII_BS 0x08 20 #define ASCII_LF 0x0A 21 #define ASCII_CR 0x0D 22 #define ASCII_XON 0x11 23 #define ASCII_XOFF 0x13 24  25 class CComStatus 26 { 27  public: 28

HANDLE m_hCom; 29

BYTE m_bComId; 30

BYTE m_bByteSize; 31

BYTE m_bStopBits; 32

BYTE m_bParity; 33

DWORD m_dwBaudRate; 34  35

//WORD m_fChEvt; 36  37

char m_bEvtChar; 38

DWORD m_fBinary; 39

BOOL m_bConnected; 40

BOOL m_fXonXoff; 41

BOOL m_bFlowCtrl; 42

OVERLAPPED m_rdos; 43

OVERLAPPED m_wtos; 44  45

//functions 46  47

CComStatus(); 48

CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity, 49

DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary); 50

BOOL OpenConnection(); 51

BOOL CloseConnection(); 52

BOOL SetupConnection(); 53

BOOL IsConnected(); 54 }; 55  56 UINT CommWatchProc( LPVOID lpData ); 57 BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite); 58 int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength ); 59 int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut); 60 #endif 61  62 /// 63  64 #include "stdafx.h" 65 #include "com232.h" 66  67 BYTE XwCom=0x40; 68 BYTE sCom1[5],sCom2[MAXBLOCKLENGTH+12],sCom3[MAXBLOCKLENGTH+12]; 69 BYTE opation; 70 short ComNum; 71 CComStatus::CComStatus() 72 { 73  m_hCom = NULL; 74  m_bComId = (char)ComNum;//COM1 75  m_bByteSize=8; 76  m_bStopBits=ONESTOPBIT; 77  m_bParity=NOPARITY; 78  m_dwBaudRate=9600; 79  m_bEvtChar=EVENTCHAR; 80  m_fBinary=1; 81  m_bConnected = FALSE; 82  m_bFlowCtrl = FC_XONXOFF ; 83  m_fXonXoff = FALSE; 84 } 85  86 CComStatus::CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary) 87 { 88  m_hCom = NULL; 89  m_bComId = bComId; 90  m_bByteSize=bByteSize; 91  m_bStopBits=bStopBits; 92  m_bParity=bParity; 93  m_dwBaudRate=dwBaudRate; 94  m_bEvtChar=bEvtChar; 95  m_fBinary=fBinary; 96  m_bConnected = FALSE; 97  m_bFlowCtrl = FC_XONXOFF ; 98  m_fXonXoff = FALSE; 99 }100 101 BOOL CComStatus::OpenConnection()102 {103  char csCom[10];104  COMMTIMEOUTS CommTimeOuts ;105  if((m_bComId < 0) || (m_bComId > 4))106

return FALSE;//從COM1到COM4107  if(m_hCom)//if already open108  return FALSE;109 110  //OVERLAPPED包含異步I/O信息111 112  m_rdos.Offset = 0;113  m_rdos.OffsetHigh = 0;114  m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);115  if(m_rdos.hEvent == NULL)116

return FALSE;117  m_wtos.Offset = 0;118  m_wtos.OffsetHigh = 0;119  m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);120  if(m_wtos.hEvent == NULL)121  {122

CloseHandle(m_rdos.hEvent);123

return FALSE;124  }125 126  wsprintf(csCom,"COM%d",m_bComId);127 128  m_hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,ILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);129 130  if(m_hCom == INVALID_HANDLE_VALUE) {131

//dwError = GetLastError();132

// handle error 133

return FALSE;134  }135  else136  {137

SetCommMask( m_hCom, EV_RXCHAR ) ; // get any early notifications138

SetupComm( m_hCom, 4096, 4096 ) ; // setup device buffers139

// purge any information in the buffer140 141

PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR ) ;142 143

// set up for overlapped I/O144 145

DWORD dwTemp = 1000 / (this->m_dwBaudRate / 8);146

CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;147

CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//((dwTemp > 0) ? dwTemp : 1);148

CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;149 150

// CBR_9600 is approximately 1byte/ms. For our purposes, allow151

// double the expected time per character for a fudge factor.152 153

CommTimeOuts.WriteTotalTimeoutMultiplier =2*CBR_9600/this->m_dwBaudRate;//( npTTYInfo ) ;154

CommTimeOuts.WriteTotalTimeoutConstant = 0;//1000 ;155 156

SetCommTimeouts( m_hCom, &CommTimeOuts ) ;157  }158  if(!SetupConnection())159  {160

CloseConnection();161

return FALSE;162  }163  EscapeCommFunction( m_hCom, SETDTR );164  m_bConnected = TRUE;165  return TRUE;166 }167 168 BOOL CComStatus::CloseConnection()169 {170  if (NULL == m_hCom)171

return ( TRUE ) ;172  // set connected flag to FALSE173  m_bConnected = FALSE;174  // disable event notification and wait for thread175  // to halt176  SetCommMask( m_hCom, 0 ) ;177  EscapeCommFunction( m_hCom, CLRDTR ) ;178  // purge any outstanding reads/writes and close device handle179  PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;180  CloseHandle( m_hCom ) ;181  m_hCom = NULL;182 183  // change the selectable items in the menu184 185  CloseHandle(m_rdos.hEvent);186  CloseHandle(m_wtos.hEvent);187  return ( TRUE ) ;188 }189 190 BOOL CComStatus::SetupConnection()191 {192  BOOL fRetVal ;193  BYTE bSet ;194  DCB dcb ;195  if(m_hCom == NULL)196

return FALSE; 197  dcb.DCBlength = sizeof( DCB ) ;198  GetCommState( m_hCom, & dcb ) ;199  dcb.BaudRate = this->m_dwBaudRate;200  dcb.ByteSize = this->m_bByteSize;201  dcb.Parity = this->m_bParity;202  dcb.StopBits = this->m_bStopBits ;203  dcb.EvtChar = this->m_bEvtChar ;204  // setup hardware flow control205  bSet = (BYTE) ((m_bFlowCtrl & FC_DTRDSR) != 0) ;206  dcb.fOutxDsrFlow = bSet ;207  if (bSet)208

dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;209  else210

dcb.fDtrControl = DTR_CONTROL_ENABLE ;211  bSet = (BYTE) ((m_bFlowCtrl & FC_RTSCTS) != 0) ;212  dcb.fOutxCtsFlow = bSet ;213  if (bSet)214

dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ;215  else216

dcb.fRtsControl = RTS_CONTROL_ENABLE ;217  // setup software flow control218  bSet = (BYTE) ((m_bFlowCtrl & FC_XONXOFF) != 0) ;219  dcb.fInX = dcb.fOutX = bSet ;220  dcb.XonChar = ASCII_XON ;221  char xon = ASCII_XON ;222  dcb.XoffChar = ASCII_XOFF ;223  char xoff = ASCII_XOFF ;224  dcb.XonLim = 100 ;225  dcb.XoffLim = 100 ;226  // other various settings227  dcb.fBinary = TRUE ;228  dcb.fParity = TRUE ;229  fRetVal = SetCommState( m_hCom, &dcb ) ;230  return ( fRetVal ) ;231 } // end of SetupConnection()232 233 BOOL CComStatus::IsConnected()234 {235  return m_bConnected;236 }237 238 UINT CommWatchProc( LPVOID lpData )239 {240  DWORD dwEvtMask ;241  //NPTTYINFO npTTYInfo = (NPTTYINFO) lpData ;242  OVERLAPPED os ;243  int nLength ;244  //BYTE abIn[ MAXBLOCK + 1] ;245 246  CComStatus * pCom = (CComStatus *)lpData;247  memset( &os, 0, sizeof( OVERLAPPED ) ) ;248  // create I/O event used for overlapped read249 250  os.hEvent = CreateEvent( NULL, // no security251

TRUE, // explicit reset req252

FALSE, // initial event reset253

NULL ) ; // no name254 255  if (os.hEvent == NULL)256  {257

MessageBox( NULL, "Failed to create event for thread!", "TTY Error!",MB_ICONEXCLAMATION | MB_OK ) ;258

return ( FALSE ) ;259  }260  if (!SetCommMask( pCom->m_hCom, EV_RXCHAR ))261

return ( FALSE ) ;262  char buf[256];263  while ( pCom->m_bConnected )264  {265

dwEvtMask = 0 ;266

WaitCommEvent( pCom->m_hCom, &dwEvtMask, NULL );267

if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)268

{269

if ((nLength = ReadCommBlock( *pCom, (LPSTR) buf, 255 )))270

{271

//WriteTTYBlock( hTTYWnd, (LPSTR) abIn, nLength ) ;272

buf[nLength]="\0";273

AfxMessageBox(buf);274

}275

}276  }277  CloseHandle( os.hEvent ) ;278  return( TRUE ) ;279 } // end of CommWatchProc()280 281 int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength )282 {283  BOOL fReadStat ;284  COMSTAT ComStat ;285  DWORD dwErrorFlags;286  DWORD dwLength;287  DWORD dwError;288 289  char szError[ 10 ] ;290 291  // only try to read number of bytes in queue292 293  ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;294  dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;295 296  if (dwLength > 0)297  {298

fReadStat = ReadFile( comDev.m_hCom, lpszBlock,dwLength, &dwLength, & (comDev.m_rdos) ) ;299

if (!fReadStat)300

{301

if (GetLastError() == ERROR_IO_PENDING)302

{303

OutputDebugString("\n\rIO Pending");304

while(!GetOverlappedResult( comDev.m_hCom ,&(comDev.m_rdos), & dwLength, TRUE ))305

{306

dwError = GetLastError();307

if(dwError == ERROR_IO_INCOMPLETE)308

// normal result if not finished309

continue;310

else311

{312

// an error occurred, try to recover313

wsprintf( szError, "", dwError ) ;314

ClearCommError( comDev.m_hCom , &dwErrorFlags, &ComStat ) ;315

break;316

}317

}318

}319

else320

{321

// some other error occurred322

dwLength = 0 ;323

ClearCommError( comDev.m_hCom , &dwErrorFlags, &ComStat ) ;324

}325

}326  }327  return ( dwLength ) ;328 } // end of ReadCommBlock()329 330 int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut)331 {332  LPSTR lpOffset=lpszBlock;333  int nReadCount = 0;334  char chBuf;335  //time_t beginTime,endTime;336  if(!comDev.m_hCom)337

return 0;338  if(dwTimeOut <= 0)339

return 0;340  MSG msg;341  //time(&beginTime);342  DWORD dwLastTick,dwNowTick,dwGoneTime;343  dwGoneTime = 0;344  dwLastTick = GetTickCount();345  dwNowTick = dwLastTick;346  // double diftime;347  do348  {349

if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))350

{351

::TranslateMessage(&msg);352

::DispatchMessage(&msg);353

}354

if(ReadCommBlock(comDev,&chBuf,1) > 0)355

{356

//TRACE("----get a char----\n");357

*lpOffset = chBuf;358

lpOffset ++;359

nReadCount ++;360

}361

dwNowTick = GetTickCount();362

if(dwNowTick < dwLastTick)363

{364

dwLastTick = dwNowTick;365

}366 367

dwGoneTime = dwNowTick - dwLastTick;368 369

//TRACE("gon time = %lu\n",dwGoneTime);370 371  }while((nReadCount < nMaxLength) && (dwGoneTime < dwTimeOut));372  return (nReadCount);373 }//end ReadCommBlockEx374 375 BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite)376 {377  BOOL fWriteStat ;378  DWORD dwBytesWritten ;379  DWORD dwErrorFlags;380  DWORD dwError;381  DWORD dwBytesSent=0;382  COMSTAT ComStat;383 384  char szError[ 128 ] ;385 386  fWriteStat = WriteFile( comDev.m_hCom , lpByte, dwBytesToWrite,&dwBytesWritten, &( comDev.m_wtos) ) ;387  if (!fWriteStat)388  {389

if(GetLastError() == ERROR_IO_PENDING)390

{391

while(!GetOverlappedResult( comDev.m_hCom,&(comDev.m_wtos), & dwBytesWritten, TRUE ))392

{393

dwError = GetLastError();394

if(dwError == ERROR_IO_INCOMPLETE)395

{396

// normal result if not finished397

dwBytesSent += dwBytesWritten;398

continue;399

}400

else401

{402

// an error occurred, try to recover403

wsprintf( szError, "", dwError ) ;404

ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;405

break;406

}407

}408

dwBytesSent += dwBytesWritten;409

if( dwBytesSent != dwBytesToWrite )410

wsprintf(szError,"\nProbable Write Timeout: Total of %ld bytes sent", dwBytesSent);411

else412

wsprintf(szError,"\n%ld bytes written", dwBytesSent);413

OutputDebugString(szError);414

}415

else416

{417

// some other error occurred418

ClearCommError( comDev.m_hCom, &dwErrorFlags, &ComStat ) ;419

return ( FALSE );420

}421  }422  return ( TRUE ) ;423 } // end of WriteCommBlock()

四、小結(jié) 以上給出了用Win32 API設計串行通信的基本思路,在實際應用中,我們可以利用Win32 API設計出滿足各種需要的串行通信程序。

歡迎各位電子愛好者轉(zhuǎn)載。

PS原文出自http://soft.yesky.com/50/2214050_2.shtml

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四
一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 久久综合久久久| 欧美日韩在线直播| 一区二区三区日韩在线观看| 欧美性猛交99久久久久99按摩| 亚洲理论在线| 国产精品系列在线| 久久一本综合频道| 9色porny自拍视频一区二区| 国产精品男女猛烈高潮激情| 久久精品亚洲乱码伦伦中文| 亚洲精品一区久久久久久| 国产精品xxx在线观看www| 性欧美videos另类喷潮| 在线欧美三区| 国产女人aaa级久久久级| 狂野欧美性猛交xxxx巴西| 夜夜嗨av一区二区三区| 国产日韩免费| 欧美精品在线视频观看| 久久精品99无色码中文字幕| 日韩视频在线观看| 国一区二区在线观看| 欧美日韩成人一区二区三区| 久久国产福利国产秒拍| 亚洲精品国产系列| 国产在线精品自拍| 欧美色网一区二区| 久久精品夜色噜噜亚洲a∨| 日韩一二三在线视频播| 国产在线观看一区| 国产精品久久久久久av下载红粉| 久久久夜精品| 欧美一区=区| 亚洲午夜精品久久久久久app| 在线观看成人网| 国产婷婷色一区二区三区在线| 欧美不卡视频一区发布| 久久久久国产精品厨房| 小黄鸭精品密入口导航| 一区二区欧美在线| 亚洲欧洲久久| 亚洲大胆av| 黑人巨大精品欧美一区二区| 国产欧美日韩另类一区 | 国产精品三区www17con| 欧美日产一区二区三区在线观看| 久久久综合网站| 久久国内精品自在自线400部| 亚洲中无吗在线| 亚洲特级毛片| 亚洲午夜在线观看| 99国产精品久久久久久久成人热| 在线观看三级视频欧美| 激情综合自拍| 精品成人国产| 亚洲福利专区| 亚洲欧洲三级| 亚洲精品一区二区三区樱花| 亚洲日本久久| 99天天综合性| 亚洲综合精品一区二区| 亚洲欧美成人网| 亚洲欧美综合v| 亚洲欧美在线免费| 欧美在线视频二区| 久久久91精品| 久久午夜视频| 欧美精品日韩www.p站| 欧美激情一二区| 欧美视频在线一区二区三区| 国产精品影视天天线| 国产亚洲成人一区| 亚洲国产黄色| 亚洲午夜精品17c| 久久国产精品第一页| 久久久综合免费视频| 欧美激情a∨在线视频播放| 欧美精品激情| 国产精品视频1区| 精品福利免费观看| 亚洲精品久久久久久久久久久久久 | 黄色在线成人| 亚洲精品一区二区在线| 亚洲性视频h| 久久久久99| 欧美日韩激情网| 国产欧美精品va在线观看| 精品成人一区| 亚洲色图自拍| 美女精品在线| 国产精品一区2区| 亚洲国产精品成人久久综合一区| 亚洲视频二区| 美女免费视频一区| 国产精品日本欧美一区二区三区| 精品动漫3d一区二区三区| 正在播放欧美视频| 久久午夜电影| 国产精品一区二区久久久久| 亚洲国产天堂久久综合网| 亚洲在线成人| 欧美精品在线观看91| 国产综合色在线视频区| 一区二区三区四区在线| 久久午夜视频| 国产一区二区三区丝袜| 亚洲素人一区二区| 欧美精品成人| 精品999网站| 午夜精彩国产免费不卡不顿大片| 欧美精品色综合| 在线欧美亚洲| 久久精品国产成人| 国产欧美日韩一区二区三区在线| 亚洲精品视频一区| 麻豆九一精品爱看视频在线观看免费| 欧美午夜精品久久久久久人妖| 亚洲国产精品v| 久久久久久久久久看片| 国产精品影院在线观看| 亚洲少妇诱惑| 欧美日韩日日夜夜| 亚洲免费观看高清完整版在线观看熊| 久久久亚洲国产美女国产盗摄| 国产精品久久看| 亚洲男同1069视频| 国产精品色在线| 亚洲免费人成在线视频观看| 欧美新色视频| 一本色道久久综合亚洲精品小说 | 亚洲夜间福利| 欧美日韩视频在线观看一区二区三区| 亚洲电影成人| 欧美成人精品一区二区| 亚洲高清在线观看一区| 久久艳片www.17c.com| 激情成人亚洲| 欧美1区视频| 亚洲美女一区| 欧美日韩在线播| 亚洲亚洲精品在线观看| 国产精品久久久久久久久动漫| 亚洲一区三区电影在线观看| 国产精品久久网| 性欧美激情精品| 狠狠久久亚洲欧美| 免费一区二区三区| 日韩小视频在线观看| 欧美午夜大胆人体| 香蕉久久一区二区不卡无毒影院 | 黑人一区二区三区四区五区| 久久久国产精品亚洲一区| 激情自拍一区| 欧美激情精品久久久久久蜜臀| 亚洲美女av在线播放| 国产精品久久二区| 久久激情视频| 亚洲人成网站777色婷婷| 欧美日韩中文字幕| 午夜视频在线观看一区| 国语精品中文字幕| 欧美人体xx| 欧美一区国产一区| 亚洲区中文字幕| 国产精品久久久久av免费| 久久精品成人欧美大片古装| 亚洲电影免费观看高清| 欧美日韩在线一区二区| 久久精选视频| 99精品视频免费观看视频| 国产伦精品一区二区三区高清版| 开心色5月久久精品| 99在线精品观看| 国内一区二区在线视频观看| 欧美日韩国产美| 久久久久久9| 中文一区字幕| 亚洲国产精品女人久久久| 国产精品亚洲产品| 欧美极品在线观看| 久久av资源网| 国产精品99久久久久久久女警| 极品少妇一区二区| 国产精品午夜av在线| 欧美夫妇交换俱乐部在线观看| 欧美一区二区三区四区在线| 亚洲精品一区久久久久久| 激情五月婷婷综合| 国产九九视频一区二区三区| 欧美精品日韩一区| 美女视频一区免费观看| 久久疯狂做爰流白浆xx| 在线一区二区三区四区五区| 国产日韩精品综合网站| 国产精品高潮久久| 欧美日本一区二区三区| 欧美成人首页| 欧美成人一区二区| 免费一级欧美片在线播放|