




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、用MFC實(shí)現(xiàn)串口編程(作者:付杰2000年08月04日11:28)本文詳細(xì)介紹了串行通信的基本原理,以及在 Windows NT、Win98環(huán)境下用 MFC實(shí)現(xiàn)串口 (COM)通信的方法:使用ActiveX控件或 Win API.并給出用 Visual C+6.0編寫的相應(yīng) MFC32 位應(yīng)用程序。關(guān)鍵詞:串行通信、VC+6O ActiveX控件、Win API、MFC32位應(yīng)用程序、事件驅(qū)動(dòng)、非阻塞通信、多線程 .在Windows應(yīng)用程序的開發(fā)中,我們常常需要面臨與外圍數(shù)據(jù)源設(shè)備通信的問題。計(jì) 算機(jī)和單片機(jī)(如 MCS-51)都具有串行通信口,可以設(shè)計(jì)相應(yīng)的串口通信程序,完成二者 之間的數(shù)據(jù)
2、通信任務(wù)。實(shí)際工作中利用串口完成通信任務(wù)的時(shí)候非常之多。已有一些文章介紹串口編程的文章在計(jì)算機(jī)雜志上發(fā)表。但總的感覺說來不太全面,特別是介紹32位下編程的更少,且很不詳細(xì)。筆者在實(shí)際工作中積累了較多經(jīng)驗(yàn),結(jié)合硬件、軟件,重點(diǎn)提及比較新的技術(shù),及需要注意的要點(diǎn)作一番探討。希望對(duì)各位需要編寫串口通信程序的朋友有一些幫助。一.串行通信的基本原理串行端口的本質(zhì)功能是作為 CPU和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)據(jù)從CPU經(jīng)過串行端口發(fā)送出去時(shí),字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位。在接收數(shù)據(jù)時(shí),串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。在 Windows 環(huán)境(Windows NT、Win98、Windows2000 )下,串口是系統(tǒng)
3、資源的一部分。應(yīng)用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統(tǒng)提出資源申請(qǐng)要求(打開串口),通信完成后必須釋放資源(關(guān)閉串口)。串口通信程序的流程如下圖:申請(qǐng)資涯配字?jǐn)?shù)串口信號(hào)線的接法一個(gè)完整的RS-232C接口有22根線,采用標(biāo)準(zhǔn)的 25芯插頭座(或者9芯插頭座)。25芯和9芯的主要信號(hào)線相同。以下的介紹是以25芯的RS-232C為例。主要信號(hào)線定義:2腳:發(fā)送數(shù)據(jù)TXR 3腳:接收數(shù)據(jù) RXD, 4腳:請(qǐng)求發(fā)送 RTS 5腳:清除發(fā)送CTS6腳:數(shù)據(jù)設(shè)備就緒 DSR 20腳:數(shù)據(jù)終端就緒 DTR; 8腳:數(shù)據(jù)載波檢測(cè) DCD;1腳:保護(hù)地;7腳:信號(hào)地。電氣特性:數(shù)據(jù)傳輸速率最大可到
4、20K bps最大距離僅15m.注:看了微軟的 MSDN 6.0,其Windows API中關(guān)于串行通訊設(shè)備(不一定都是串口RS-232C或RS-422或RS-449)速率的設(shè)置,最大可支持到 RS_256000,即256K bps!也不知道到底是 什么串行通訊設(shè)備?但不管怎樣,一般主機(jī)和單片機(jī)的串口通訊大多都在9600 bps,可以滿足通訊需求。接口的典型應(yīng)用:大多數(shù)計(jì)算機(jī)應(yīng)用系統(tǒng)與智能單元之間只需使用3到5根信號(hào)線即可工作。這時(shí),除了 TXHRXD以外,還需使用 RTS CTS DCD DTR DSR等信號(hào)線。(當(dāng)然,在程序中也需要對(duì)相應(yīng) 的信號(hào)線進(jìn)行設(shè)置。)圖最簡(jiǎn)單的RS232-C信號(hào)線
5、接法以上接法,在設(shè)計(jì)程序時(shí),直接進(jìn)行數(shù)據(jù)的接收和發(fā)送就可以了,不需要 對(duì)信號(hào)線的狀態(tài)進(jìn)行判斷或設(shè)置。(如果應(yīng)用的場(chǎng)合需要使用握手信號(hào)等,需要對(duì)相應(yīng)的信號(hào)線的 狀態(tài)進(jìn)行監(jiān)測(cè)或設(shè)置。)三.16位串口應(yīng)用程序的簡(jiǎn)單回顧16位串口應(yīng)用程序中,使用的16位的Windows API通信函數(shù):OpenComm()打開串口資源,并指定輸入、輸出緩沖區(qū)的大小(以字節(jié)計(jì)) ;CloseComm() 關(guān)閉串口例: int idComDev;idComDev = OpenComm("COM1", 1024, 128);CloseComm(idComDev);BuildCommDCB()、setCo
6、mmState()填寫設(shè)備控制塊 DCB,然后對(duì)已打開的串口進(jìn)行參數(shù) 配置 ;例: DCB dcb;BuildCommDCB("COM1:2400,n,8,1", &dcb);SetCommState(&dcb); ReadComm 、 WriteComm() 對(duì)串口進(jìn)行讀寫操作,即數(shù)據(jù)的接收和發(fā)送.例: char *m_pRecieve; int count;ReadComm(idComDev,m_pRecieve,count);Char wr30; int count2;WriteComm(idComDev,wr,count2);16 位下的串口通信程序
7、最大的特點(diǎn)就在于:串口等外部設(shè)備的操作有自己特有的API 函數(shù);而 32 位程序則把串口操作(以及并口等)和文件操作統(tǒng)一起來了,使用類似的操作。四.在MFC下的32位串口應(yīng)用程序32位下串口通信程序可以用兩種方法實(shí)現(xiàn):利用ActiveX控件;使用API通信函數(shù)。使用ActiveX控件,程序?qū)崿F(xiàn)非常簡(jiǎn)單,結(jié)構(gòu)清晰,缺點(diǎn)是欠靈活;使用 API通信函數(shù)的優(yōu) 缺點(diǎn)則基本上相反。以下介紹的都是在單文檔(SDI)應(yīng)用程序中加入串口通信能力的程序。 使用 ActiveX控件:VC+ 6.0 提供的 MSComm 控件通過串行端口發(fā)送和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介紹
8、MSComm 控件的資料。.在當(dāng)前的 Workspace中插入 MSComm控件。Project 菜單 >Add to Project>Components and Controls>RegisteredActiveX Controls->選擇Components: Microsoft Communications Control,version 6.0 插入到當(dāng)前的Workspace 中。結(jié)果添加了類 CMSComm(及相應(yīng)文件:mscomm.h和mscomm.cpp )。.在 MainFrm.h中加入 MSComm控件。protected:CMSComm m_Com
9、Port;在 Mainfrm.cpp:OnCreare() 中:DWORD style=WS_VISIBLE|WS_CHILD;if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)TRACE0("Failed to create OLE Communications Controln");return -1;/ fail to create .初始化串口m_ComPort.SetCommPort(1);/選擇COM?m_ComPort. SetInBufferSize(1024); / 設(shè)置輸入緩
10、沖區(qū)的大小,Bytesm_ComPort. SetOutBufferSize(512); / 設(shè)置輸入緩沖區(qū)的大小,Bytes/if(!m_ComPort.GetPortOpen() / 打開串口m_ComPort.SetPortOpen(TRUE);m_ComPort.SetInputMode(1); / 設(shè)置輸入方式為二進(jìn)制方式m_ComPort.SetSettings("9600,n,8,1"); / 設(shè)置波特率等參數(shù)m_ComPort.SetRThreshold(1); / 為 1 表示有一個(gè)字符引發(fā)一個(gè)事件m_ComPort.SetInputLen(0);.捕捉串
11、口事項(xiàng)。MSComm控件可以采用輪詢或事件驅(qū)動(dòng)的方法從端口獲取數(shù)據(jù)。我們介紹比較使用的事件驅(qū)動(dòng)方法:有事件(如接收到數(shù)據(jù))時(shí)通知程序。在程序中需要捕獲并處理這些通訊事件。在 MainFrm.h 中:protected:afx_msg void OnCommMscomm();DECLARE_EVENTSINK_MAP()在 MainFrm.cpp 中:BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)/映射ActiveX控件事件END_EVENTSIN
12、K_MAP().串口讀寫.完成讀寫的函數(shù)的確很簡(jiǎn)單,GetInput()和SetOutput()就可。兩個(gè)函數(shù)的原型是:VARIANT GetInput();及 void SetOutput(const VARIANT& newValue);者B要使用 VARIANT類型(所 有Idispatch:Invoke的參數(shù)和返回值在內(nèi)部都是作為VARIANT對(duì)象處理的)。無論是在PC機(jī)讀取上傳數(shù)據(jù)時(shí)還是在PC機(jī)發(fā)送下行命令時(shí),我們都習(xí)慣于使用字符串的形式(也可以說是數(shù)組形式)。查閱VARIANT文檔知道,可以用BSTR表示字符串,但遺憾的是所有的BSTRIB是包含寬字符,即使我們沒有定義_U
13、NICODE_UNICOD也是這樣! WinNT 支持寬字符,而Win95并不支持。為解決上述問題,我們?cè)趯?shí)際工作中使用CbyteArray,給出相應(yīng)的部分程序如下:void CMainFrame:OnCommMscomm()VARIANT vResponse; int k;if(m_commCtrl.GetCommEvent()=2) k=m_commCtrl.GetInBufferCount(); / 接收到的字符數(shù)目if(k>0) vResponse=m_commCtrl.GetInput(); /readSaveData(k,(unsigned char*) vResponse.
14、parray->pvData); / 接收到字符,MSComm 控件發(fā)送事件。 。 。 。 。/ 處理其他MSComm 控件void CMainFrame:OnCommSend() oooooooo /準(zhǔn)備需要發(fā)送的命令,放在 TxData口中CByteArray array;array.RemoveAll();array.SetSize(Count);for(i=0;i<Count;i+)array.SetAt(i, TxDatai);m_ComPort.SetOutput(COleVariant(array); / 發(fā)送數(shù)據(jù)請(qǐng)大家認(rèn)真關(guān)注第、中內(nèi)容,在實(shí)際工作中是重點(diǎn)、難點(diǎn)所在
15、。 使用 32 位的 API 通信函數(shù):可能很多朋友會(huì)覺得奇怪:用32位API函數(shù)編寫串口通信程序,不就是把 16位的API換成32位嗎? 16位的串口通信程序可是多年之前就有很多人研討過了此文主要想介紹一下在API 串口通信中如何結(jié)合非阻塞通信、多線程等手段,編寫出高質(zhì)量的通信程序。特別是在CPU 處理任務(wù)比較繁重、與外圍設(shè)備中有大量的通信數(shù)據(jù)時(shí),更有實(shí)際意義。.在中MainFrm.cpp定義全局變量HANDLEhCom; / 準(zhǔn)備打開的串口的句柄HANDLEhCommWatchThread ;/ 輔助線程的全局函數(shù).打開串口,設(shè)置串口hCom =CreateFile( "COM2
16、", GENERIC_READ | GENERIC_WRITE,/允許讀寫/0,/ 此項(xiàng)必須為0NULL,/ no security attrsOPEN_EXISTING,/設(shè)置產(chǎn)生方式FILE_FLAG_OVERLAPPED, /我們準(zhǔn)備使用異步通信/NULL );請(qǐng)大家注意,我們使用了FILE_FLAG_OVERLAPPED構(gòu)。這正是使用 API實(shí)現(xiàn)非阻塞通信的關(guān)鍵所在。ASSERT(hCom!=INVALID_HANDLE_VALUE);楂測(cè)打開串口操作是否成功SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );/設(shè)置事件驅(qū)動(dòng)的類型/SetupCo
17、mm( hCom, 1024,512) ; / 設(shè)置輸入、輸出緩沖區(qū)的大小PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR ); /清干凈輸入、輸出緩沖區(qū) /COMMTIMEOUTS CommTimeOuts ; /定義超時(shí)結(jié)構(gòu),并填寫該結(jié)構(gòu)SetCommTimeouts( hCom, &CommTimeOuts ) ;/ 設(shè)置讀寫操作所允許的超時(shí)DCBdcb ; / 定義數(shù)據(jù)控制塊結(jié)構(gòu)GetCommState(hCom, &dcb ) ; / 讀串口原來的參數(shù)設(shè)置dcb.
18、BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;SetCommState(hCom, &dcb ) ; / 串口參數(shù)配置上述的COMMTIMEOUTS結(jié)構(gòu)和DCB都很重要,實(shí)際工作中需要仔細(xì)選擇參數(shù)。啟動(dòng)一個(gè)輔助線程,用于串口事件的處理。Windows 提供了兩種線程,輔助線程和用戶界面線程。區(qū)別在于:輔助線程沒有窗口,所以它沒有自己的消息循環(huán)。但是輔助線程很容易編程,通常也很有用。在次,我們
19、使用輔助線程。主要用它來監(jiān)視串口狀態(tài),看有無數(shù)據(jù)到達(dá)、通信有無錯(cuò)誤;而主線程則可專心進(jìn)行數(shù)據(jù)處理、提供友好的用戶界面等重要的工作。hCommWatchThread=CreateThread( (LPSECURITY_ATTRIBUTES) NUL全屬性0,/ 初始化線程棧的大小,缺省為與主線程大小相同(LPTHREAD_START_ROUTINE)CommWatchProc,績程的全局函數(shù)GetSafeHwnd(), / 此處傳入了主框架的句柄0, &dwThreadID );ASSERT(hCommWatchThread!=NULL);為輔助線程寫一個(gè)全局函數(shù),主要完成數(shù)據(jù)接收的工作
20、。請(qǐng)注意OVERLAPPED吉構(gòu)的使用, 以及怎樣實(shí)現(xiàn)了非阻塞通信。UINT CommWatchProc(HWND hSendWnd)DWORD dwEvtMask=0 ;SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );有哪些串口事件需要監(jiān)視?/WaitCommEvent( hCom, &dwEvtMask, os );/ 等待串口通信事件的發(fā)生檢測(cè)返回的dwEvtMask,知道發(fā)生了什么串口事件:if (dwEvtMask & EV_RXCHAR) = EV_RXCHAR) /緩沖區(qū)中有數(shù)據(jù)到達(dá)COMSTAT ComStat ; DWORD
21、 dwLength;ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;dwLength = ComStat.cbInQue ; / 輸入緩沖區(qū)有多少數(shù)據(jù)?if (dwLength > 0) BOOL fReadStat ;fReadStat = ReadFile( hCom, lpBuffer, dwLength, &dwBytesRead,&READ_OS( npTTYInfo ) ); /讀數(shù)據(jù)注:我們?cè)?CreareFile()時(shí)使用了 FILE_FLAG_OVERLAPPED在 ReadFile()也必
22、須使用LPOVERLAPPE結(jié)構(gòu).否則,函數(shù)會(huì)不正確地報(bào)告讀操作已完成了.使用LPOVERLAPPE綃構(gòu),ReadFile()立即返回,不必等待讀操作完成,實(shí)現(xiàn)非阻塞通信.此時(shí),ReadFile()M回 FALSE, GetLastError嶇回 ERROR_IO_PENDING.if (!fReadStat)if (GetLastError() = ERROR_IO_PENDING)while(!GetOverlappedResult(hCom,&READ_OS( npTTYInfo ), & dwBytesRead, TRUE )dwError = GetLastError
23、();if(dwError = ERROR_IO_INCOMPLETE) continu;e/ 緩沖區(qū)數(shù)據(jù)沒有讀完,繼續(xù)二PostMessage(HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);通知主線程,串口收到數(shù) 據(jù)所謂的非阻塞通信,也即異步通信。是指在進(jìn)行需要花費(fèi)大量時(shí)間的數(shù)據(jù)讀寫操作(不僅僅是指串行通信操作)時(shí),一旦調(diào)用ReadFile()、 WriteFile(), 就能立即返回,而讓實(shí)際的讀寫操作在后臺(tái)運(yùn)行;相反,如使用阻塞通信,則必須在讀或?qū)懖僮魅客瓿珊蟛拍芊祷亍?由于操作可能需要任意長的時(shí)間才能完成,于是問題就出現(xiàn)了。非常阻塞操作還允許讀、寫操作能同時(shí)
24、進(jìn)行(即重疊操作?) ,在實(shí)際工作中非常有用。要使用非阻塞通信,首先在CreateFile()時(shí)必須使用FILE_FLAG_OVERLAPPE濰后在ReadFile() 時(shí)©Overlapped參數(shù)一定不能為 NULL,接著檢查函數(shù)調(diào)用的返回值,調(diào)用 GetLastError(), 看是否返回 ERROR_IO_PENDING如是,最后調(diào)用 GetOverlappedResult()返回重疊操作 (overlapped operation) 的結(jié)果 ;WriteFile() 的使用類似。.在主線程中發(fā)送下行命令。BOOL fWriteStat ; char szBuffercount
25、;準(zhǔn)備好發(fā)送的數(shù)據(jù),放在szBufer口中fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite,&dwBytesWritten, &WRITE_OS( npTTYInfo ) ); / 寫數(shù)據(jù)注:我們?cè)?CreareFile()時(shí)使用了 FILE_FLAG_OVERLAPPE現(xiàn)在 WriteFile()也必須使用 LPOVERLAPPE結(jié)構(gòu).否則,函數(shù)會(huì)不正確地報(bào)告寫操作已完成了.使用LPOVERLAPPED吉構(gòu),WriteFile()立即返回,不必等待寫操作完成,實(shí)現(xiàn)非阻塞 通信. 此時(shí),WriteFile()返回 FAL
26、SE, GetLastError軀回 ERROR_IO_PENDING.int err=GetLastError();if (!fWriteStat) if(GetLastError() = ERROR_IO_PENDING)while(!GetOverlappedResult(hCom, &WRITE_OS( npTTYInfo ),&dwBytesWritten, TRUE ) dwError = GetLastError();if(dwError = ERROR_IO_INCOMPLETE)/ normal result if not finisheddwBytesSen
27、t += dwBytesWritten; continue; 綜上, 我們使用了多線程技術(shù),在輔助線程中監(jiān)視串口,有數(shù)據(jù)到達(dá)時(shí)依靠事件驅(qū)動(dòng),讀入數(shù)據(jù)并向主線程報(bào)告(發(fā)送數(shù)據(jù)在主線程中,相對(duì)說來,下行命令的數(shù)據(jù)總是少得多);并且,WaitCommEvent()、 ReadFile()、 WriteFile() 都使用了非阻塞通信技術(shù),依靠重疊 ( overlapped )讀寫操作,讓串口讀寫操作在后臺(tái)運(yùn)行。依托 vc6.0 豐富的功能,結(jié)合我們提及的技術(shù),寫出有強(qiáng)大控制能力的串口通信應(yīng)用程序。就個(gè)人而言,我更偏愛API 技術(shù),因?yàn)榭刂剖侄我`活的多,功能也要強(qiáng)大得多。串口編程學(xué)習(xí)日記(1)200
28、7-09-12 11:08串口編程的要點(diǎn)其實(shí)就是如何控制收發(fā)數(shù)據(jù)。它也屬于數(shù)據(jù)流模型的一種, 我們平常接觸比較多的是文件流操作, 控制臺(tái)的流操作( 其實(shí)還是文件流),socket 流等等 .接觸過這類編程的程序員應(yīng)該都知道, 流編程其實(shí)就4 個(gè)操作 .1. 打開 2. 讀 3. 寫 4. 關(guān)閉看起來很簡(jiǎn)單, 但真正在程序中用好它們, 還需要注意很多細(xì)節(jié). 比如 收發(fā)數(shù)據(jù)的同步大數(shù)據(jù)量的收發(fā)如何處理連接超時(shí)的處理等等.2. 打開const CHAR * name = ".com4"HANDLE com_handle = :CreateFile(name,GENERIC_REA
29、D | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);需要注意的是這里除了 name可以更改以外,其余的參數(shù)必須使用上述的值 .name的命名規(guī) 則是. + 串口名.如這里是.com4.這樣的命名是為了兼容有些老的 WINDOWS(比如 WIN98)和某些虛擬串口而采用的.如 果 需 要 枚 舉 系 統(tǒng) 中 的 串 口 ,可 以 訪 問 注 冊(cè) 表 hkey_local_machinehardwaredevicemapseriaLcOMM即可.打開以后還要做些初始化的操作, 比如設(shè)置串口的屬性, 設(shè)置串口的讀寫超時(shí)
30、( 很重要 ), 清空可能遺留在串口中的數(shù)據(jù)緩沖等.首先設(shè)置串口的屬性,在WIN32中,有個(gè)DCB勺結(jié)卞體,我們只要填充它就可以了 .因?yàn)檫@個(gè)結(jié) 構(gòu)體比較大,我們可以采用 WIN32提供的函數(shù)BuildCommDC睞構(gòu)建它.這里需要提供4項(xiàng)內(nèi)容 .baud( 波特率 ) parity( 奇偶校驗(yàn)) data( 數(shù)據(jù)位 ) stop( 停止位 ). 關(guān)于這個(gè)函數(shù)的其它細(xì)節(jié) , 可以查閱MSDN.DCB dcb;if (!BuildCommDCB(L"baud=19200 parity=N data=8 stop=1",&dcb) / 錯(cuò)誤處理 return FALSE
31、;然后我們通過SetCommState 來設(shè)置 DCB.if (!SetCommState(com_handle,&m_dcb)/ 錯(cuò)誤處理 return FALSE;之后我們?cè)僭O(shè)置 COMH的讀寫超時(shí).我們需要填充 COMMTIMEOUTS吉構(gòu).COMMTIMEOUTS time_outs;time_outs.ReadIntervalTimeout = 0x0A;time_outs.ReadTotalTimeoutConstant = 0;time_outs.ReadTotalTimeoutMultiplier = 0;time_outs.WriteTotalTimeoutConst
32、ant = 0;time_outs.WriteTotalTimeoutMultiplier = 5000;這里每項(xiàng)值的含義要看MSDN我是采用 windows串口通訊工具里的默認(rèn)設(shè)置.接下來用SetCommTimeouts 來設(shè)置超時(shí).if (!SetCommTimeouts(com_handle,&time_outs)/ 錯(cuò)誤處理return FALSE;最后我們要清空數(shù)據(jù)緩沖,以避免遺留的數(shù)據(jù)干擾我們正常的程序.用PurgeComm來達(dá)到目的.if (!:PurgeComm(com_handle, PURGE_TXABORT | PURGE_RXABORT| PURGE_TXCLE
33、AR | PURGE_RXCLEAR )/ 錯(cuò)誤處理return FALSE;到這一步, 我們的打開操作就算完成(2)2007-09-12 11:403. 讀 , 寫我們知道,我們剛創(chuàng)建COMMO柄是基于overlapped結(jié)構(gòu)的.也就是一種異步機(jī)制.overlapped 結(jié)構(gòu)里只有一項(xiàng)我們需要關(guān)心, 就是一個(gè)event 句柄 .既然我們需要讀寫操作, 那當(dāng)然得要有2 個(gè) event 句柄才夠.所以我們要先創(chuàng)建兩個(gè)event 句柄 .enum READ = 0,WRITE,LAST ;HANDLE eventLAST;for (INT i = 0;i < LAST;+i) eventi
34、= :CreateEvent(NULL,FALSE,FALSE,NULL);因?yàn)樽x寫都是異步的, 那為了 準(zhǔn)備好 接收數(shù)據(jù), 我們還需要預(yù)先調(diào)用一次讀操作, 這里要用ReadFile.CHAR recv_buffer1024;memset(recv_buffer,0,1024);OVERLAPPED ovLAST;memset(&ovREAD,0,sizeof(OVERLAPPED);ovREAD.hEvent = eventREAD;:ReadFile(com_handle,recv_buffer,1024,NULL,&ovREAD);好了,到這里為止,我們就已經(jīng)準(zhǔn)備好接收C
35、OM口來的數(shù)據(jù)了,但什么時(shí)候數(shù)據(jù)會(huì)來到了,這個(gè)時(shí)候我們就得用到剛才創(chuàng)建的兩個(gè)event 了 .while (TRUE) DWORD index = :WaitForMultipleObjects(LAST,event,FALSE,500); if (index = WAIT_TIMEOUT) continue;index = index - WAIT_OBJECT_0;/ 有數(shù)據(jù)送到串口了if (index = READ) DWORD bytes = 0;:GetOverlappedResult(com_handle,&ovREAD,&bytes,FALSE);if (byte
36、s > 0) / 處理收到的數(shù)據(jù)吧,bytes 為收到的數(shù)據(jù)長度./ 繼續(xù)等待接收memset(recv_buffer,0,1024);OVERLAPPED ovLAST;memset(&ovREAD,0,sizeof(OVERLAPPED);ovREAD.hEvent = eventREAD;:ReadFile(com_handle,recv_buffer,1024,NULL,&ovREAD);/ 數(shù)據(jù)已經(jīng)發(fā)送出去了else if (index = WRITE)DWORD bytes = 0;:GetOverlappedResult(com_handle,&ov
37、WRITE, &bytes,FALSE);if (bytes > 0)/ 處理已經(jīng)發(fā)送出去的數(shù)據(jù)( 這個(gè)一般不用處理, 只是為了同步收發(fā)才用的到)讀和寫的循環(huán)基本就這樣了, 但一般情況下, 我們會(huì)把這個(gè)循環(huán)放到一個(gè)獨(dú)立的線程中去做,這里簡(jiǎn)單點(diǎn), 就放到主線程了.如果要發(fā)數(shù)據(jù), 還得再單獨(dú)寫一個(gè)函數(shù).CHAR send_buffer1024;BOOLEAN SendData(const CHAR * data,INT len)memset(&ovWRITE,0,sizeof(OVERLAPPED);ovWRITE.hEvent = eventWRITE;memcpy(sen
38、d_buffer,data,len);:WriteFile(com_handle,send_buffer,len,NULL,&ovWRITE);這個(gè)函數(shù)需要注意的是, 當(dāng)數(shù)據(jù)還沒有真正的發(fā)送出去的時(shí)候, 再次調(diào)用它會(huì)出問題, 所以 ,我們一般還要對(duì)發(fā)送的數(shù)據(jù)做一個(gè)同步處理, 比較通用的做法是維護(hù)一個(gè)發(fā)送隊(duì)列, 如果正在發(fā)送時(shí), 那么就把待發(fā)的數(shù)據(jù)放到隊(duì)列里, 等真正發(fā)送完畢串口編程學(xué)習(xí)日記(3)2007-09-12 13:394. 關(guān)閉把我們創(chuàng)建的資源都釋放掉就OK了.:Close(com_handle);for (INT i = 0;i < LAST;+i)memset(&am
39、p;ovi,0,sizeof(OVERLAPPED);:CloseHandle(eventi);如果還創(chuàng)建了線程的話, 別忘記合理的中斷線程.一名高級(jí)軟件工程師的職業(yè)規(guī)劃2007 年 12 月 30 日 星期日 下午 02:45在我上初中的時(shí)候,我接觸到了一種名叫BASIC的程序匯編語言.當(dāng)我第一眼看到它時(shí), 我就夢(mèng)想著能有一天成為控制計(jì)算機(jī)的主人. 而在我進(jìn)入了大學(xué)后更是學(xué)會(huì)了理性地看待我的目標(biāo), 在對(duì)自身作出了比較全面而客觀的分析和比較后 , 我選擇了高級(jí)軟件工程師作為我大學(xué)四年甚至整個(gè)人生的奮斗目標(biāo).一 . 高級(jí)系統(tǒng)工程師的職業(yè)定義:高級(jí)軟件工程師是IT 行業(yè)中的重要崗位. 根據(jù)開發(fā)進(jìn)度
40、和任務(wù)分配, 完成相應(yīng)模塊軟件的設(shè)計(jì)、開發(fā)、編程任務(wù); 進(jìn)行程序單元、功能的測(cè)試, 查出軟件存在的缺陷并保證其質(zhì)量; 進(jìn)行編制項(xiàng)目文檔和質(zhì)量記錄的工作; 維護(hù)軟件使之保持可用性和穩(wěn)定性. 軟件開發(fā)是一個(gè)系統(tǒng)的過程, 需要經(jīng)過市場(chǎng)需求分析、軟件代碼編寫、軟件測(cè)試、軟件維護(hù)等程序. 軟件開發(fā)工程師在整個(gè)過程中扮演著非常重要的角色, 主要從事根據(jù)需求開發(fā)項(xiàng)目軟件工作.二 . 行業(yè)背景和發(fā)展前途:軟件和信息服務(wù)外包產(chǎn)業(yè)已成為各個(gè)國家經(jīng)濟(jì)發(fā)展的重點(diǎn). 從增加值角度來看 , 同樣金額的出口, 服務(wù)外包對(duì)中國經(jīng)濟(jì)的貢獻(xiàn)是來料加工的20 倍以上 ;從能源消耗上看,服務(wù)外包單位GDPfg耗僅為制造業(yè)的20%.這
41、在中國政府大 力倡導(dǎo)可持續(xù)發(fā)展戰(zhàn)略以及大力發(fā)展高技術(shù)第三產(chǎn)業(yè)的主旋律下是適應(yīng)中國經(jīng)濟(jì)發(fā)展 , 也是符合中國社會(huì)客觀需求的. 可以看到的是, 未來中國軟件和信息服務(wù)外包產(chǎn)業(yè)發(fā)展空間巨大, 其原因有三: 首先是具有成本優(yōu)勢(shì), 中國低成本的競(jìng)爭(zhēng)優(yōu)勢(shì)是全世界公認(rèn)的. 第二 , 具有人力資源優(yōu)勢(shì), 中國是世界上人力資源極為豐富的國家, 軟件和信息服務(wù)外包服務(wù)業(yè)是勞動(dòng)密集型產(chǎn)業(yè), 中國未來在軟件和信息服務(wù)外包業(yè)內(nèi)將成為全球最具競(jìng)爭(zhēng)力的轉(zhuǎn)移承接地. 第三 , 中國有非常龐大的國內(nèi)市場(chǎng), 這是中國吸引跨國公司進(jìn)入很重要的一個(gè)原因.但與發(fā)展?jié)摿Σ粚?duì)稱的是, 現(xiàn)今中國軟件和信息產(chǎn)業(yè)人才相當(dāng)缺乏, 據(jù)調(diào)查研究顯示
42、, 當(dāng)前中國軟件和信息服務(wù)外包產(chǎn)業(yè)人才流動(dòng)率較高, 而且缺口很大.企業(yè)成立時(shí)間比較短, 規(guī)模大多比較小, 企業(yè)人才平均流動(dòng)率達(dá)18.28%, 這和缺乏培訓(xùn)、業(yè)務(wù)來源不穩(wěn)定、報(bào)酬機(jī)制不夠合理等因素有關(guān). 同時(shí)由于產(chǎn)業(yè)發(fā)展迅速 , 人才供不應(yīng)求, 尤其是本地化人才和中高級(jí)管理人才.市場(chǎng)需求的巨大和專業(yè)人才的缺乏令人吃驚, 但這正是商機(jī)和盈利的重要突破口 . 可以預(yù)見 , 中國軟件和信息服務(wù)外包產(chǎn)業(yè)將在不久的將來成為引領(lǐng)中國第三產(chǎn)業(yè)轉(zhuǎn)型和發(fā)展的龍頭產(chǎn)業(yè), 相關(guān)職業(yè)包含高級(jí)軟件工程師的人才需求將會(huì)非常巨大 .三 . 職業(yè)所需基本技術(shù)及素質(zhì):1. 編程開發(fā)工具.至少熟練掌握兩到三種開發(fā)工具的使用, 這是
43、程序員的立身之本. C/C+ 以其高效率和高度的靈活性成為開發(fā)工具中的利器, 很多系統(tǒng)級(jí)的軟件還是用C/C+瑞寫.而JAVA的跨平臺(tái)和與 WEB艮好的2合是JAVA的優(yōu)勢(shì)所在.其次,如果能掌握一種簡(jiǎn)便的可視化開發(fā)工具, 如 VB,PowerBuilder,Delphi,C+Builder, 則更好 , 這些開發(fā)工具減小了開發(fā)難度, 并能夠在無形中強(qiáng)化對(duì)象模型的概念. 另外 , 需要掌握基本的腳本語言, 如 shell,perl 等 .2. 數(shù)據(jù)庫 .數(shù)據(jù)庫在當(dāng)今的信息外包產(chǎn)業(yè)是很重要的. 很多應(yīng)用程序都是以數(shù)據(jù)庫的數(shù)據(jù)為中心, 而數(shù)據(jù)庫的產(chǎn)品也有不少, 其中關(guān)系型數(shù)據(jù)庫仍是主流形式, 所以作為
44、高級(jí)軟件工程師而言, 至少熟練掌握一兩種數(shù)據(jù)庫, 對(duì)關(guān)系型數(shù)據(jù)庫的關(guān)鍵元素非常清楚,熟練掌握SQL的基本語法是非常重要的.3. 網(wǎng)絡(luò)協(xié)議TCP/IP.在互聯(lián)網(wǎng)如此普及的今天,如果還沒有對(duì)互聯(lián)網(wǎng)的支撐協(xié)議 TCP/IP協(xié)議棧有很好的掌握就很難在IT 業(yè)立足 . 從最早的客戶/服務(wù)器結(jié)構(gòu), 到今天的WEBServices, 這一切都離不開以TCP/IP 協(xié)議棧為基礎(chǔ)的網(wǎng)絡(luò)協(xié)議支持, 所以 ,深入掌握TCP/IP 協(xié)議是非常必要的.4. 軟件工程與CMM.現(xiàn)代大型軟件系統(tǒng)的開發(fā)中, 工程化的開發(fā)控制成為軟件系統(tǒng)成功的保證. 編程只是軟件生命周期中的其中一環(huán), 本人認(rèn)為優(yōu)秀的軟件工程師應(yīng)該掌握軟件開發(fā)
45、各個(gè)階段的基本技能, 如市場(chǎng)分析, 可行性分析, 需求分析, 結(jié)構(gòu)設(shè)計(jì),詳細(xì)設(shè)計(jì),軟件測(cè)試等.否則就永遠(yuǎn)只會(huì)是一個(gè)程序員,而無法成為名副其實(shí) 的工程師.5. 計(jì)算機(jī)技術(shù)專業(yè)英語.隨著中國的信息外包產(chǎn)業(yè)逐步展開,IT業(yè)急需與國外相關(guān)高新技術(shù)接軌來保持 在發(fā)展上不落人后.于是IT業(yè)相關(guān)從業(yè)人員現(xiàn)有的英語水平成為限制中國信 息產(chǎn)業(yè)與國外交流的瓶頸.一個(gè)普遍的共識(shí)是:良好的英語交流和閱讀能力成 為衡量一個(gè)軟件工程師水平的隱性標(biāo)準(zhǔn).所以掌握計(jì)算機(jī)專業(yè)英語是很重要的6. 強(qiáng)烈的好奇心和學(xué)習(xí)精神.對(duì)于一個(gè)立志成為高級(jí)軟件工程師的人,最重要的其實(shí)是強(qiáng)烈的好奇心和學(xué)習(xí) 精神.沒有比強(qiáng)烈的好奇心和學(xué)習(xí)精神更好的武
46、器了 ,它是成功的工程師乃至 在各行各業(yè)的成功者們永攀高峰的源泉和動(dòng)力所在.界500強(qiáng)英語面試題500強(qiáng)企業(yè)面試時(shí),常常用英語來進(jìn)行問答,當(dāng)面試官用英語向你提出問題時(shí),你要是能講一口流利的英語,再配合使用眼神、手勢(shì)等形體語言,那無疑是為您的面試錦上添花,所有的面試官都會(huì)對(duì)你刮目相看。宏威管理咨詢有限公司的美籍華人、核心咨詢師Dejun Lee告訴大家:在國內(nèi),英語的口語有兩大類:一類是中國式的英語,這種口語是將要回答的問題先用漢語組織好文章或句子,然后再翻譯成英語,這當(dāng)然是口語不過關(guān)的表現(xiàn),也是不過關(guān)的癥結(jié)所在;另一類就是完全按外國人的方式和習(xí)慣,直接用英語來組織語言,這當(dāng)然是英語口語已經(jīng)很順
47、暢或完全過關(guān)了。二者之間當(dāng)然還跨越著一段距離,還需今后繼續(xù)努力,目前,你達(dá)到哪類就按哪類準(zhǔn)備,先解燃眉之急吧,反正那也不是一日之功。500強(qiáng)企業(yè)面試時(shí),常用英語提出問題。 宏威職業(yè)顧問經(jīng)過歸納總結(jié),將500強(qiáng)面試的問題基本上是按前面我們所說的能力素質(zhì)模型,分成3類16條,每一條里有幾個(gè)不同的問題,大體如下:一.分析判斷能力:1 .分析能力:1)請(qǐng)給出一個(gè)事例,表明你在面對(duì)情況非常復(fù)雜的局面的時(shí)候是如何分析和評(píng)估的Tell me about a complex situation which you have had to analyze and assess.2)當(dāng)你面對(duì)一個(gè)有矛盾沖突的問題時(shí)
48、,你會(huì)怎么做?When you have been faced with conflicting information about a pr oblem, what have you done?3) 請(qǐng)列舉一個(gè)你在工作中面對(duì)一種微妙而又困難的局面時(shí),能夠成功地保持客觀的分析能力的例子。Tell me about an occasion where you successfully maintained youobjectivity in addressing a sensitive and difficult situation at work.2 .市場(chǎng)敏感度:1)請(qǐng)給出一個(gè)你滿足消費(fèi)者或
49、客戶需求變化的例子。Tell me about a timewhen you have addresseda change in consumers' or customers' needs.you have involved?2) 你最近的一次創(chuàng)新活動(dòng)是什么?What is the most recent initiative3) 是否曾經(jīng)將一些想法或?qū)嵺`方法從外部世界中帶入到你的工作或?qū)W習(xí)中去?What ideas or practices have you brought into your work/ stud y from the external world?3 .
50、創(chuàng)造力:1) 請(qǐng)給出一個(gè)你用創(chuàng)造性的方案解決企業(yè)問題的例子。Tell me about creative solutions to business problems that you h ave come up with.2)請(qǐng)描述一下你最近創(chuàng)新或新開發(fā)的事物。Describe a recent innovation or new development that you have in troduced.3) 是否可以給出一個(gè)你提供給其他同事的不同的方式方法或看待問題的角度的例子?Can you give me an example of when you had a different
51、approac h or business perspective to your colleagues?4 .清晰的目的性:tacked complex wor1)請(qǐng)給出一個(gè)你成功地解決一件非常復(fù)雜的工作的事例,并說明你是如何確定哪些工作需要完成的。Tell me about a time when you successfullyk issue and how you worked outwhat needed to be done.2) 什么時(shí)候你處理過一個(gè)在最終期限前你無法完成的項(xiàng)目?When have you worked on a projectwhere the deadline
52、couldn ' t be met?3)請(qǐng)給出一個(gè)你必須在同一時(shí)間完成很多項(xiàng)任務(wù)的事例。Tell me about a time when you have had to manage a large numb er of activities at the same time.5 .學(xué)習(xí)能力:1) 請(qǐng)給出一個(gè)最近你從別人的錯(cuò)誤中有所學(xué)習(xí)的例子。Tell me about the last time you learned from someone else ' s mis take.2)請(qǐng)給出一個(gè)最近你從事的項(xiàng)目或任務(wù)的例子,在該項(xiàng)目或任務(wù)中,(最起碼剛開始)的表現(xiàn)不盡人意。
53、Please describe a recent task or project in which, at least ini tially, your performance was less than satisfactory.3)你認(rèn)為你最需要的專業(yè)發(fā)展的方面是什么?What do you believe are the areas in which you require the mos t professional development?6 .結(jié)構(gòu)化的思維能力:1)某快速消費(fèi)品公司最近遇到了利潤下降的問題,請(qǐng)你分析一下可能的原因。The profit of a FMCG compa
54、ny decreases recently. Please analyze possible reasons of the profit decrease.2) 某美國地鐵公司希望投資中國地鐵,希望五年可收回投資,請(qǐng)你做一個(gè)可行性分析。A certainUS basedSubwayCompany planedto investon Subway ofChina, andtheyhopethe investment can bereturnedin five years.Pleaseconducta feasibilityanalysis.二.人際交往能力:1 .領(lǐng)導(dǎo)能力:1)請(qǐng)給出一個(gè)你必須展
55、示你的領(lǐng)導(dǎo)能力的例子。Tell me of an occasion where you had to demonstrate business le adership.2)什么情況下,你會(huì)不得不出面對(duì)職責(zé)進(jìn)行進(jìn)一步的界定或解決團(tuán)隊(duì)的問題,以保持績效水平?When have you had to intervene to clarify roles or resolve team issues to obtain performance ?3)你怎樣運(yùn)用目標(biāo)和目的來驅(qū)動(dòng)團(tuán)隊(duì)達(dá)到卓越的績效?How have you used targets or goals to drive outstanding performa nce?2 .溝通影響力:1)請(qǐng)給出一個(gè)最近你培訓(xùn)和指導(dǎo)他人的例子。Tell me of a recent occasion when you contributed to the traini ngoreducation ofanother person.2) 你具備哪些輔導(dǎo)或給予他人反饋的經(jīng)驗(yàn)?What experienceincoachingandgivingfeedbackhave you had3)你為下屬創(chuàng)造過什么樣的學(xué)習(xí)或發(fā)展機(jī)會(huì)?What development or learning opportunities have you created
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 制作拍攝合同范本
- 債務(wù)變更合同范本
- 代銷汽車合同范本
- 二手車合同范本商家自己寫
- 分階段付款合同范本
- 華帝櫥柜合同范本
- 農(nóng)村建房主體合同范本
- 單位門合同范本
- 醫(yī)療美容轉(zhuǎn)讓合同范例
- 產(chǎn)品設(shè)計(jì)開發(fā)合同范本
- CJJ2-2008城市橋梁工程施工與質(zhì)量驗(yàn)收規(guī)范
- 病媒生物防治操作規(guī)程
- 2024年社會(huì)工作者《社會(huì)工作實(shí)務(wù)(中級(jí))》考試真題必考題
- 德育教育研究課題申報(bào)書
- (高清版)JTG 3810-2017 公路工程建設(shè)項(xiàng)目造價(jià)文件管理導(dǎo)則
- 《煤礦重大事故隱患判定標(biāo)準(zhǔn)》試題及答案
- 《ISO31000:2024風(fēng)險(xiǎn)管理指南》指導(dǎo)手冊(cè)(雷澤佳譯2024-04)
- 學(xué)前兒童表演游戲的組織與指導(dǎo)(學(xué)前兒童游戲課件)
- 建筑用真空陶瓷微珠絕熱系統(tǒng)應(yīng)用技術(shù)規(guī)程
- (高清版)DZT 0214-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 銅、鉛、鋅、銀、鎳、鉬
- 《拒絕校園欺凌 防霸凌主題班會(huì)》課件
評(píng)論
0/150
提交評(píng)論