天天微頭條丨用VC6.0實現(xiàn)上位機串口通信
串口是常用的計算機與外部串行設備之間的數(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”,GENERICREAD|GENERICWRITE,0,NULL,OPENEXISTING,FILEATTRIBUTENORMAL,NULL))==INVALIDHANDLEVALUE)
return FALSE; //設置超時控制 SetCommTimeouts(hComDev,&timeouts); //設置接收緩沖區(qū)和輸出緩沖區(qū)的大小 SetupComm(hComDev,1024,512); //獲取缺省的DCB結(jié)構(gòu)的值 GetCommState(hComDev,&dcb); //設定波特率為9600 bps dcb.BaudRate=CBR9600; //設定無奇偶校驗 dcb.fParity=NOPARITY; //設定數(shù)據(jù)位為8 dcb.ByteSize=8; //設定一個停止位 dcb.StopBits=ONESTOPBIT; //監(jiān)視串口的錯誤和接收到字符兩種事件 SetCommMask(hComDev,EVERR|EVRXCHAR); //設置串行設備控制參數(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ù)應增加FILEFLAGOVERLAPPED 標志。
數(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 & EVRXCHAR)==EVRXCHAR)
……//接收到字符事件后,可以將此消息登記到由pParam有指定的窗口類中進行處理
if(dwEventMask & EVERR)==EVERROR)
……//發(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,PURGETXABORT| PURGERXABORT|PURGETXCLEAR|PURGERXCLEAR); //關閉設備句柄 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
標簽:
相關推薦:
精彩放送:
- []每日快報!粘膠短纖維市場現(xiàn)狀是什么?粘膠短纖維的未來發(fā)展趨勢
- []數(shù)據(jù)結(jié)構(gòu)試題有哪些?數(shù)據(jù)結(jié)構(gòu)試題及評分解析
- []熱議:c語言餐桌游戲有哪些?教會你這十款酒桌游戲讓你在朋友圈穩(wěn)站“C”位!
- []招行信用卡榮獲“2022年度金質(zhì)信用卡天璣獎”
- []“快閃”成都,五糧濃香兔年生肖酒打響旺季攻勢、搶跑“春節(jié)檔”!
- []挑選運動耳機不踩雷!一篇文章告訴你想知道的所有
- []全球觀點:【東海期貨12月8日宏觀金融日報】:國內(nèi)疫情防控措施進一步優(yōu)化
- []中信建投期貨12月8日早間交易策略
- []視訊!蘇州高新發(fā)行3億元超短期融資券 利率2.48%
- []焦點信息:央行:支持房地產(chǎn)市場平穩(wěn)健康發(fā)展 用好“保交樓”專項借款加大對房企貸款投放力度
- []鋒龍股份:公司首發(fā)募集資金和可轉(zhuǎn)債募集資金投資項目正按項目計劃在緊鑼密鼓地建設和籌備工作中
- []科恒股份:公司的主營業(yè)務為鋰電智能裝備及鋰離子正極材料,沒有涉足下游電芯制造
- []世界速看:普洛斯倉儲物流封閉式基礎設施公募REITs狀態(tài)更新為“已反饋”
- []世界熱文:ST愛迪爾:公司負債及現(xiàn)金流情況詳見公司最新定期報告
- []【熱聞】雅居樂集團與農(nóng)行廣東分行簽約 后者在同等條件下優(yōu)先為雅居樂提供必要綜合融資服務
- []廣州知識城攜北京華瑞錦泰以3.07億元競得廣州黃埔區(qū)一宗商地
- []駿成科技:此輪疫情對公司的生產(chǎn)以及業(yè)績影響不大,從公司公布的三季報數(shù)據(jù)可見
- []成人補鈣吃什么鈣片好?金丐醋酸鈣科學補鈣更輕松
- []環(huán)球今亮點!深圳峰匯創(chuàng)投發(fā)展擬轉(zhuǎn)讓長興中建投38.5%股權(quán) 底價1.62億元
- []重慶輪船集團掛牌宜賓天港物流40%股權(quán)及債權(quán) 轉(zhuǎn)讓底價為199萬元
- []僑銀股份新增投資霸州僑銀環(huán)保科技 持股比例100%
- []華發(fā)股份:公司已披露定增預案,具體內(nèi)容詳見公司于12月6日上海證券交易所網(wǎng)站披露的公告
- []一起教育科技發(fā)布2022年三季度財報:業(yè)績穩(wěn)中向好,連續(xù)四個季度實現(xiàn)盈利
- []全球觀天下!安徽滁州超29億元成交九宗地塊 總出讓面積848畝
- []長春3.86億元掛牌5宗地 總出讓面積37.28萬平米
- []當前快訊:珍寶島:公司的參股公司安徽九洲方圓制藥有限公司有飲片業(yè)務,據(jù)了解,目前業(yè)務規(guī)模營收億元左右
- []全球快消息!海航科技與天津信托和解
- []當前速訊:賣地發(fā)工資的邏輯
- []全球視訊!“三支箭”出弓地產(chǎn)度過“最難時光”?43只地產(chǎn)債大幅反彈近一月漲幅翻倍
- []互聯(lián)網(wǎng)巨頭也要跨界儲能?
- []當前消息!1000000000元!環(huán)保龍頭成立電池儲能公司
- []機會?蔚藍鋰芯電池生產(chǎn)線改造投產(chǎn)
- []全球時訊:3分鐘!電池儲能安全問題解決了?
- []什么是分布式儲能?分布式儲能系統(tǒng)有哪些功能?
- []環(huán)球報道:自費社保一年需交多少 社保自費一年得交多少錢
- []微資訊!從上海離職了怎么把公積金取出來,可分為三個步驟
- []天天滾動:青竹畫材科創(chuàng)板IPO進程終止:原計劃募資4億元,劉其通為控股股東
- []【全球新視野】中國電氣裝備集團12.84億元上海靜安拿地 將建總部大樓
- []當前報道:德國股市收低;截至收盤DAX 30下跌0.57%
- []每日消息!保險公司的分類
- []養(yǎng)老保險能退嗎
- []天天熱點!公積金綁定哪個銀行卡 公積金綁定的是哪個銀行卡
- []央行營業(yè)管理部:加大對房地產(chǎn)企業(yè)和建筑企業(yè)的貸款投放力度
- []環(huán)球快消息!一筆關聯(lián)交易 建發(fā)國際“低價”購入上海閔行兩宗地
- []朗進科技:公司未參與沙特的“The Line”未來城市項目
- []簡訊:中梁控股1月至11月合約銷售額620億元 銷售面積594萬平
- []朗進科技:12月6日公司高管張進、張永利減持公司股份合計1.2萬股
- []環(huán)球新消息丨數(shù)碼視訊:12月6日公司高管鄭海濤減持公司股份合計8萬股
- []世界今日訊!科華數(shù)據(jù):12月6日公司高管林清民增持公司股份合計7300股
- []當前焦點!美瑞新材:12月6日公司高管任光雷減持公司股份合計10萬股
- []每日看點!容知日新5名股東合計減持201.64萬股 套現(xiàn)2.23億 2022年前三季度公司凈利4470.9萬
- []每日熱文:德信中國1-11月合約銷售金額約336億元
- []信息:海航投資將延期至12月21日前回復深交所半年報問詢函
- []【世界新視野】福州1-9月累計住房公積金提取72億 為23風險樓盤放款4.23億
- []【環(huán)球時快訊】光大地產(chǎn)至11月底接近4000套房屋全部提前交付
- []宣泰醫(yī)藥提示風險 熊去氧膽酸膠囊產(chǎn)品不涉及新冠病毒防治
- []世界短訊!道通科技:12月2日詹金勇減持公司股份合計8750股
- []今日聚焦!珀萊雅:12月6日公司高管方玉友減持公司股份合計24萬股
- []今日報丨ST宏達實控人被證監(jiān)會擬罰1000萬元 律師明確可索賠區(qū)間
- []遠洋集團11月協(xié)議銷售額108.6億 前11月累計銷售895億元
- []財面兒|金地商置與金地集團續(xù)訂兩個服務協(xié)議 自明年1月1日起生效
- []快看點丨財面兒丨中國金茂1-11月累計取得簽約銷售金額共1374.8億元
- []每日頭條!粵水電:公司本次重組已取得中國證監(jiān)會的核準批復,相關工作正在進行當中
- []每日動態(tài)!上坤地產(chǎn):2022年前11個月合約銷售額約79.2億元
- []全球熱訊:財面兒|金地“21金地MTN007”將于12月15日償付利息6060萬元
- []旭輝控股集團前11月合同銷售1175.9億元
- []天天消息!二手房周報 | 15城成交再降8%,京蓉等皆不及年內(nèi)周均(11.28-12.4)
- []韋爾股份:公司會一如既往的努力加強經(jīng)營管理,努力做好經(jīng)營,提升公司競爭力,實現(xiàn)穩(wěn)定的業(yè)績增長回饋股東
- []今日播報!宜昌城發(fā)地產(chǎn)底價29.6億競得宜昌市伍家崗4宗地塊
- []香港11月底官方外匯儲備資產(chǎn)增加60億美元
- []全球微資訊!中天金融:公司逾期債務對應的擔保余額15.1億元
- []新華都:北京重力久致科技有限公司將在經(jīng)營范圍內(nèi)開展工作
- []武商集團:公司目前僅在南昌有酒店項目
- []天天熱消息:江蘇無錫支持“外擺位” 打造“夜市經(jīng)濟”
- []快看:印度股市年均回報率接近20%,IT、材料、工業(yè)等行業(yè)回報率高
- []國際航協(xié):全球航空業(yè)今年虧損收窄,明年將回歸盈利
- []頭條:龍光集團境內(nèi)債整體展期獲得通過 累計展期規(guī)模超223億元
- []環(huán)球今頭條!上海中海物業(yè)因未履行二次供水水質(zhì)檢測等被處罰6000元
- []環(huán)球焦點!沃森生物:公司在研新冠疫苗項目均在努力推進上市進程,公司將根據(jù)臨床進度和數(shù)據(jù)情況開展上市申報
- []全球快訊:英飛拓:公司暫未開展與卡塔爾世界杯足球賽相關業(yè)務
- []天天快資訊丨上坤地產(chǎn):前11月合約銷售金額約為79.2億元
- []訊息:世茂股份:1-11月銷售簽約金額約86億,銷售簽約面積約66萬平方米
- []環(huán)球速看:2023年樓市怎么走,房價漲不漲?最早一份機構(gòu)預測出爐
- []環(huán)球觀速訊丨九豐能源:目前,公司境外主要貨源地在馬來西亞、印度尼西亞、澳大利亞、卡塔爾等地,氣源供應優(yōu)質(zhì)、穩(wěn)定
- []天天訊息:天虹股份:可以通過天虹APP及天虹小程序購買天優(yōu)醬酒
- []環(huán)球微頭條丨風能相關上市公司有哪些?風能上市公司龍頭有哪些?
- []鹽上市公司有哪些?相關上市公司龍頭一覽?
- []全球熱門:安防概念股票有哪些?安防概念股龍頭有哪些?
- []【環(huán)球新要聞】2021年地熱概念股有哪些?相關地熱概念股一覽?
- []騰訊上市公司股票有哪些?相關騰訊上市公司有哪些?
- []龍光成第二家境內(nèi)債整體展期房企 展期規(guī)模約220億元
- []2021年超導概念股有哪些?超導概念龍頭股一覽?
- []全球視訊!安科生物股票今天多少錢一股?安科生物股票代碼是多少?
- []訊息:2021年銅龍頭概念股有哪些?銅概念股一覽?
- []化纖行業(yè)板塊上市公司有哪些?2021年化纖行業(yè)板塊股票一覽?
- []環(huán)球播報:雄安股票有哪些?相關雄安概念股票有哪些?
- []2021年新冠核酸上市公司龍頭股票有哪些?2021年新冠核酸概念股有哪些?
- []2021年農(nóng)林牧漁板塊龍頭股有哪些?股票代碼是多少?
- []環(huán)球關注:萬里揚: 公司在浙江省的獨立儲能電站項目都在正常推進中
- []人民幣貶值受益股有哪些?人民幣貶值板塊股票2020一覽?
- 世界信息:圖片或手寫簽名轉(zhuǎn)電子簽名怎么轉(zhuǎn)?手寫簽名轉(zhuǎn)電子簽名教程
- 天天微頭條丨用VC6.0實現(xiàn)上位機串口通信
- 基礎版本的基礎版本 直方圖均衡化系列
- Android中LayoutParams是什么?Android中LayoutParams總結(jié)和用法
- 全球新資訊:會議panel是什么意思?醫(yī)學術語中的panel到底是指什么?
- 當前動態(tài):顏料墨水和染料墨水的區(qū)別是什么?顏料墨水和染料墨水簡介
- ssm大學生兼職論壇是什么?大學生兼職有哪些?
- 天天視訊!浪漫主義時期的音樂有哪些?浪漫主義樂派是什么?
- 快資訊丨攝氏度和開氏度的換算 開氏度和攝氏度的換算公式
- 怎么設置交換機?計算機交換機連接設置方法
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內(nèi)研發(fā)費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發(fā)布2021年Q2財報 期內(nèi)凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內(nèi)實現(xiàn)營收同比增長17.27億元
- 汽車之家發(fā)布2021年第二季度業(yè)績 期內(nèi)新能源汽車品牌收入增長238%
- 中信銀行上半年實現(xiàn)凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創(chuàng)新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉(zhuǎn)營收賬款持續(xù)下降
- 【全球新要聞】煤炭股票有哪些?煤炭概念股一覽?
- 哪些是智能手表概念股?智能手表概念股名單一覽?
- 高新興股票價格是多少?高新興公司經(jīng)營范圍有哪些?
- 焦點熱訊:橡膠V帶概念股票有哪些?橡膠V帶概念股一覽?
- 微動態(tài)丨石墨烯上市公司股票有哪些?石墨烯上市公司龍頭一覽?
- 【天天報資訊】OLED概念股有哪些?相關OLED概念股一覽?
- 【熱聞】永太科技:公司以含氟技術為核心,在氟苯精細化學品領域發(fā)展多年,產(chǎn)品種類繁多
- 水泥概念龍頭股有哪些?水泥概念股有哪些?
- 環(huán)球熱消息:中國鐵建擬發(fā)行22億元中期票據(jù)用于償還到期債務
- 世界聚焦:ST宏達:公司目前尚未達到撤銷其他風險警示的條件,相關事項請關注公司后續(xù)披露
- 國際金價下方支撐仍看向1758美元
- 天天看熱訊:美原油交易策略:供給過剩擔憂升溫,油價或劍指70關口
- 天天資訊:數(shù)據(jù) | 我國國際航線旅客量創(chuàng)疫情3年新高,但航班量相比全球仍處較低水平
- 世界快資訊:現(xiàn)貨黃金交易策略:逢低買盤支撐金價,但下行壓力依然較大
- 天天觀點:內(nèi)部收益率54.56% 聯(lián)泓新科碳酸酯鋰電材料項目將于月底前中交
- 全球通訊!華富儲能股東江蘇華富股份被司法凍結(jié) 占公司總股本11.96%
- 今日訊!一張圖:交易品種樞紐點+多空占比一覽(2022/12/07周三)
- 今日精選:里程碑丨熱烈慶祝阿詩特能源第十萬臺戶用儲能電池模組下線!
- 【世界快播報】南瑞繼保助力國家電投西藏5站光伏增配儲能保供任務
- 當前觀察:元旦假期公布,旅游平臺機票、酒店搜索應聲上漲超6倍
- 世界觀速訊丨中國機場數(shù)字化轉(zhuǎn)型的現(xiàn)實難題
- 天天快報!貴州山東杭州等地取消落地檢,熱門景區(qū)酒店還查核酸嗎?
- 德銀稱近期金價可能測試1750美元支撐,2023年料相對穩(wěn)定!
- 每日熱文:各地優(yōu)化疫情防控措施帶動出游熱,旅游產(chǎn)業(yè)鏈全面恢復尚需時間
- 豐原藥業(yè):注射用尿促性素屬于促性腺激素藥物
- 環(huán)球快資訊:12月7日如意集團漲停分析:抗菌面料,紡織服裝,防護服概念熱股
- 世界熱訊:12月7日民和股份漲停分析:養(yǎng)雞,大農(nóng)業(yè)概念熱股
- 4700米!融和元儲助力世界海拔最高的儲能電站并網(wǎng)投運
- 每日速讀!境內(nèi)債整體展期獲得通過,龍光將回歸良性健康發(fā)展軌道
- 【當前熱聞】12月7日力合科創(chuàng)漲停分析:新冠病毒防治,醫(yī)療器械,碳基材料概念熱股
- 江山經(jīng)開區(qū)發(fā)展1.13億元競得衢州江山1宗商住用地
- 實時焦點:安瀾城建3.68億元競得舟山岱山縣1宗商住用地
- 方遠房地產(chǎn)7.62億元競得臺州三門縣1宗商住用地 溢價率12.06%
- 環(huán)球關注:首開股份50億元公司債券已獲上交所受理
- 郭廣科院長醫(yī)美科普為什么有些隆胸術后會很假?
- 環(huán)球精選!12月7日漢王科技漲停分析:基因測序,流感/口罩,醫(yī)療信息化概念熱股
- 55%看好杭州樓市!貝殼研究院發(fā)布購房者置業(yè)信心報告
- 北京煤醫(yī)田秋梅:想咨詢“花蕊私密整形”又羞于啟齒?
- 北京嘉佩樂醫(yī)院靠譜嗎 正規(guī)可靠、保護患者就醫(yī)權(quán)益
- 三維天地助力動物疫控預警預報系統(tǒng)升級改造
- vollgas花式助力葡萄牙,陪你世界杯熬夜看球
- 摩洛哥首度晉級八強,海信電視見證世界杯黑馬誕生
- ? 1場進3球! 海信電視見證21歲葡萄牙小將一戰(zhàn)成名
- 即時焦點:淺議當下奢華酒店產(chǎn)品和服務
- 全球快資訊丨中信建投期貨12月7日早間交易策略
- 天天熱消息:碧桂園擬配售17.8億股 總籌48.06億港元
- 立方數(shù)科:有關股東人數(shù)請您屆時參看定期報告有關內(nèi)容
- 學單詞怕忘記——背詞神器小z口袋單詞卡幫你鞏固記憶
- 北京發(fā)布“助企紓困12條”支持開發(fā)貸款等存量融資合理展期
- 天天即時看!悅心健康:截止11月30日,公司股東總戶數(shù)82,729戶,機構(gòu)股東609戶
- 環(huán)球即時:融創(chuàng)發(fā)布最新境內(nèi)債重組方案 未到期債務展期4年
- 環(huán)球新消息丨化妝品板塊反彈!產(chǎn)業(yè)鏈有望復蘇,機構(gòu)預計這些個股明年凈利大增
- 每日看點!綠地控股:擬向不超過35名特定投資者非公開發(fā)行股票 募資用于保交樓相關項目
- 今亮點!龍湖發(fā)布中期股息以股代息計劃 涉及23億美元債券
- 天天熱資訊!千味央廚:有關公司的戰(zhàn)略規(guī)劃,請查閱公司披露的定期報告
- 當前速讀:雪榕生物:《OEM交易基礎合同》為框架性協(xié)議,該合同的簽訂不會對公司本年度業(yè)績造成重大影響
- 每日簡訊:外匯交易提醒:美元逼近200日均線,看漲信號增加,關注加拿大央行決議
- 全球訊息:融資端困難解決之后 房地產(chǎn)下一個問題應如何化解?
- 今日精選:淄博房屋建設開發(fā)擬轉(zhuǎn)讓淄博齊軒地產(chǎn)100%股權(quán) 掛牌價2210萬元
- 每日熱聞!江西贛東路橋建設掛牌轉(zhuǎn)讓華辰置業(yè)30%股權(quán) 底價為875萬元
- 漢馬科技:公司指定信息披露媒體為《中國證券報》《上海證券報》及上海證券交易所網(wǎng)站
- 每日頭條!270億龍頭出手 風口賽道現(xiàn)30億并購案
- 焦點!中糧糖業(yè):公司今年甜菜采收狀況穩(wěn)定
- 上海東浩蘭生國貿(mào)集團擬2.17億元轉(zhuǎn)讓灝震國際物流100%股權(quán)
- 全球短訊!皖新文化產(chǎn)業(yè)投資掛牌重慶皖新文投置業(yè)100%股權(quán) 底價僅1元
- 【世界新要聞】航企收錢的門道:創(chuàng)新支付方式
- 12月7日重點數(shù)據(jù)和大事件前瞻
- 【全球快播報】TD早報 | 海南多地調(diào)整跨省政策,三亞機票酒店預訂量激增3倍
- 全球聚焦:怎么可以全部提取公積金,有以下四步
- 養(yǎng)老保險余額在哪里查詢 如何查詢養(yǎng)老保險余額
- 全球滾動:業(yè)績快報 | 中海前11月合約物業(yè)銷售2567億 綠城合約銷售2630億
- 天天滾動:中裝建設:中國郵政儲蓄銀行深圳分行與公司聯(lián)合推進的數(shù)字人民幣勞務薪資發(fā)放系統(tǒng)上線了公司智鏈平臺
- 【全球新視野】公積金能補繳嗎 可以補交公積金嗎
- 聚焦:怎么查孩子交沒交學平險 如何查詢學平險有沒有買
- 全球看點:辭職了公積金怎么取,去公積金中心提取
- 利空加元!加銀本周將進一步激進加息?專家稱市場對此缺乏信心
- 焦點!【實探】北京有序恢復堂食,火鍋店接到20余桌預訂!理發(fā)店也要排長隊……
- 華仁藥業(yè):公司管理團隊的簡歷情況請查閱公司在巨潮資訊網(wǎng)披露的《2021年年度報告》
- 京基智農(nóng)擬為3家子公司提供合計不超過6.16億元擔保
- 建發(fā)國際完成配股 獲得8億港元現(xiàn)金
- 【環(huán)球快播報】財面兒丨綠地控股:擬向不超過35名特定投資者非公開發(fā)行股票
- 世界微資訊!物業(yè)丨新大正:1.28億股限售股將于12月12日解禁上市
- 山東章鼓:12月5日公司高管許春東、王崇璞減持公司股份合計18.38萬股
- 鼎龍股份:12月5日公司高管蘇敏光減持公司股份合計1000股
- 今熱點:財面兒|融信中國前11月合約銷售額567.97億元
- 祥生控股前11月合約銷售額228.75億元
- 熱議:中科信息:12月5日公司高管王曉宇減持公司股份合計16.5萬股
- 財面兒丨保利置業(yè)前11月合同銷售額450億元
- 環(huán)球簡訊:泰福泵業(yè):12月5日公司高管毛世良減持公司股份合計2.23萬股
- 保隆科技:12月5日公司高管尹術飛減持公司股份合計6000股
- 艾迪精密:12月5日公司高管宋飛增持公司股份合計8.14萬股
- 當前通訊!“第三支箭”發(fā)力,房企洗牌加速,中小市值國央企存中期成長機會
- 【環(huán)球新要聞】沃森生物:疫苗行業(yè)具有高投入、高壁壘、高回報、長周期的特點
- 環(huán)球熱門:資本月報 | 房企融資利好政策頻出,近期將迎來一波配股潮(2022年11月)
- 簡訊:奧園集團公開招標:出讓奧園健康29.9%股權(quán)
- 政策支持房地產(chǎn)平穩(wěn)健康發(fā)展,金科近期利好頻傳
- 全球觀天下!道通科技3名股東合計減持865.76萬股 套現(xiàn)合計2.96億 2022年前三季度公司凈利1.02億
- 金科股份與中國光大銀行重慶分行簽訂戰(zhàn)略合作協(xié)議
- 天天觀察:海南多地調(diào)整省外來(返)人員政策,三亞“小院兒”民宿預訂量環(huán)比增六成
- 當前信息:貝殼靜默期后回購重啟,12月5日耗資200萬美元