【正文】
And to have the resources, and the basic unit of frequent switching wrong. It is in this thought, formed under the guidance of the concept of thread. Threading is interprocess a relatively independent, but scheduling execution unit. Can the similarities and differences between from thread and process is further understanding of the concept of thread. A process is the basic unit of the distribution of resources. All about with the process of resources, such as printers, the input buffer to queue, etc, were recorded in process control block in the PCB. To show that this process has these resources or are using them. In addition, the process is preempted processor scheduling unit, and it has a plete virtual address space. And process corresponds, thread and resource allocation is irrelevant, it belongs to a process, and the other threads within with a process of resources sharing process. Moreover, when the process happens when different process scheduling with different virtual address space within the same process, and the different thread sharing the same address space. According to the thread definition thread has the following properties: (1) the thread is the process of a relatively independent within the executable units. (2) the thread is the basic scheduling unit operating system, so the thread should include the necessary information needed a scheduling. (3) because the scheduler threads are the basic unit, and the process is not a scheduling unit, so each process in created, at least for the process need to simultaneously create a thread. That is process should have at least one or more than one thread, otherwise the process cannot be scheduling execution. (4) when need, thread can create another thread. By a process is to the basic unit and have the resources within the same process, multiple threads share the process of resources. But doesn39。C++串口通信工程開發(fā)實例導(dǎo)航[M].C++串口通信技術(shù)與工程實踐[M].北京:多線程技術(shù)在串口通信中的應(yīng)用[M].參考文獻:[1] 康燦,而利用多線程進行多串口通信 ,使得系統(tǒng)對于多路串行通信進行同時控制 。如超時限還未接到下位機傳來的數(shù)據(jù),則結(jié)束此次通信聯(lián)絡(luò) ,以避免陷入死循環(huán)等待狀態(tài)。若相等則回送正確確認(rèn)幀;若不相等,則回送錯誤確認(rèn)幀。當(dāng)上位機收到一個響應(yīng)幀后,就比較第2與第4及第6與第8字節(jié)是否相等。第一種方法是:數(shù)據(jù)冗余的方法。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗。當(dāng)然沒有校驗位也是可以的。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計算機校正時鐘同步的機會。由于實際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語“包”指任何通信的情況。比如,標(biāo)準(zhǔn)的ASCII碼是0~127(7位)。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設(shè)備的通信。當(dāng)我們提到時鐘周期時,我們就是指波特率例如如果協(xié)議需要4800波特率,那么時鐘是4800Hz。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗。 典型地,串口用于ASCII碼字符的傳輸。 串口通信的概念非常簡單,串口按位(bit)發(fā)送和接收字節(jié)。串口是計算機上一種非常通用設(shè)備通信的協(xié)議。4. 2 PC機的串口協(xié)議通信協(xié)議規(guī)定通信雙方如何交換信息,上位機需要通信時首先發(fā)一個命令幀(8B長),然后等待下位機同送一個響應(yīng)幀,以決定是否進行數(shù)據(jù)交換;數(shù)據(jù)交換后還要發(fā)一個確認(rèn)幀,用來確定本次數(shù)據(jù)交換是否有錯誤發(fā)生,這四個過程如圖4所示:命令幀、響應(yīng)幀、確認(rèn)幀長度固定為8B,數(shù)據(jù)幀長度可變,有命令幀后4B規(guī)定。 9600=(2247。TH1=250 如我們要得到9600 的波特率, 和12M,定時器1 為模式2,SMOD 設(shè)為1,分別看看那所要求的TH1為何值。 通常會使用定時器1 工作在定時器工作模式2 下,這時定時值中的TL1 做為計數(shù),TH1 做為自動重裝值 ,這個定時模式下,定時器溢出后,TH1 的值會自動裝載到TL1,再次開始計數(shù),這樣可以不用軟件去干預(yù),使得定時更準(zhǔn)確。波特率=(2SMOD247。51 芯片的串口工作模式0的波特率是固定的,為fosc/12,以一個12M 的晶振來計算,那么它的波特率可以達到1M。 波特率在使用串口做通訊時,一個很重要的參數(shù)就是波特率,只有上下位機的波特率一樣時才可以進行正常通訊。它的波特率是可變的,其速率是取決于定時器1 或定時器2 的定時值(溢出速率)。RI=1,申請中斷,要求CPU 取走數(shù)據(jù)。 其它模式中則是在發(fā)送停止位之初,由硬件置位。 RB8 接收數(shù)據(jù)位8,在模式2 和3 是已接收數(shù)據(jù)的第9 位。 TB8 發(fā)送數(shù)據(jù)位8,在模式2 和3 是要發(fā)送的第9 位。, 都和上位機相連,在軟件上有串口中斷處理程序,當(dāng)要求在處理某個子程序時不允許串口被上位機來的控制字符產(chǎn)生中斷,那么可以在這個子程序的開始處加入REM=0 來禁止接收,在子程序結(jié)束處加入REM=1 再次打開串口接收。 SCON 串行口控制寄存器通常在芯片或設(shè)備中為了監(jiān)視或控制接口狀態(tài),都會引用到接口控制寄存器。當(dāng)然你也可以用其它的名稱?!睂嶋H上SBUF 包含了兩個獨立的寄存器,一個是發(fā)送寄存,另一個是接收寄存器,但它們都共同使用同一個尋址地址-99H。至于串口通信需要用到那些特殊功能寄存器呢,它們是SCON,TCON,TMOD,SCON等,各代表什么含義呢? if (m_hStation1Thread==NULL) { AfxMessageBox(創(chuàng)建線程失敗!)。數(shù)據(jù)包的格式與前面的格式相同。///釋放一個信號量 if(::WaitForSingleObject(E_end[threadid],0)==WAIT_OBJECT_0) break。//關(guān)閉連接 Sleep(2000)。 ()。 if(m_st[threadid].()) {//如果為空,則表示主線程希望子線程結(jié)束 ReleaseSemaphore(S_num,1,NULL)。//傳進來的參數(shù),用來區(qū)分讀數(shù)線程(0~31) intm_port。子通信線程中首先對串口進行初始化,然后就進入到循環(huán)等待本串口的開始連接信號到來的狀態(tài)。 ...... E_startdial[cur_].SetEvent()。amp。//等待一個空閑的可用串口 int如果有,就分配一個空閑的串口進行通信。ThreadID[ii])。ii++)//最多三十二個串口 {ThreadID[ii]=ii。為可用的串口個數(shù)。ThreadMainCommunication因此 ,每個串口都可以利用一個線程進行數(shù)據(jù)的發(fā)送和接收。但是 ,如果每個串口都采用中斷方式進行輸入 ,或有的串口采查詢方式而有的串口采用中斷方式 ,則一個線程很難滿足通信要求 ,應(yīng)當(dāng)采用多個通信線程來滿足各串口的通信要求。其中報文類型用來說明報文的類型和功能, 數(shù)據(jù)長度用來說明數(shù)據(jù)區(qū)的字節(jié)數(shù),8 位校驗碼為累加和校驗。 break。lpSerialComm1m_csCommunicationSync)。 fReadStat = ReadFile(lpSerialComm1m_hCOM, lpSerialComm1m_COMInput, dwLength, amp。 dwLength = 。dwErrorFlags, amp。 DWORD dwErrorFlags。 //m_hEventArray[0]為讀事件,m_hEventArray[1]為寫事件 switch(Event){ case 0: {//read event if(ReadMask amp。 WaitCommEvent(lpSerialComm1m_hCOM,amp。如果在調(diào)用EnterCriticalSection 時關(guān)鍵節(jié)對象已被另一個線程擁有,那么該函數(shù)將無限期等待所有權(quán)。VC++提供了多種同步對象來協(xié)調(diào)實現(xiàn)多線程的并行,Csemaphore 信號燈對象,Cmutex 互斥量對象,Cevent 事件對象,以及CcriticalSection 臨界區(qū)對象都可以做到這一點。所以必須建立同步線程,使得一個時刻只能進行一種線程操作,一個線程必須等待另一線程結(jié)束才能開始。系統(tǒng)為每一個線程分配一個 CPU 時間片,某個線程只有在分配的時間片內(nèi)才有對 CPU 的控制權(quán)。Foundation Class一種是工作線程,它不處理窗口消息,常用于后臺執(zhí)行任務(wù)。同步方式是指必須完成了讀寫操作,函數(shù)才返回,這可能造成程序死掉,因為如果在讀寫時發(fā)生了錯誤,永遠不返回就會出錯,可能線程將永遠等待在那兒。 軟件流控:串口通信中采用特殊字符XON和XOFF作為控制串口數(shù)據(jù)的收發(fā)。在單 CPU條件下 ,不可能真正實現(xiàn)并行執(zhí)行 ,線程是一種系統(tǒng)資源 ,不是無代價的 ,建議在使用多線程時要保持理智和謹(jǐn)慎。開啟讀寫兩個線程進行多串口通信 ,數(shù)據(jù)接收、 數(shù)據(jù)顯示、 發(fā)送數(shù)據(jù)三者同時執(zhí)行 ,減少了系統(tǒng)的等待時間 ,使系統(tǒng)具有更好的響應(yīng)性和高效性。讀取串口數(shù)據(jù)一般是調(diào)用 ReadFile函數(shù)。所謂中斷方式是指調(diào)用 WaitCommEvent函數(shù) ,監(jiān)測 EV _RXCHAR 事件 ,只有當(dāng)收到數(shù)據(jù)時才讀取串口 ,否則通信線程掛起。Windows CE的串口輸出 W riteFile函數(shù)不能異步操作 ,只有當(dāng)所有的數(shù)據(jù)都發(fā)送完畢或超過一定時間后 ,W riteFile函數(shù)才返回。return。SetCommMask (hCom[ n Index], EV_RXCHAR | EV_TXEMPTY) 。dcb[ n Index] . Parity =ODDPAR ITY。/ /設(shè)置串口信息dcb[ n Index] . BaudRate = 9600。if (!m_CreateFlag){ for (n Index = 0。HANDLE m_hThreadWrite。HANDLE hCom[8 ]。關(guān)閉串口:程序結(jié)束或需要釋放串口資源時,應(yīng)該正確關(guān)閉串口,關(guān)閉串口比較簡單,使用API調(diào)用CloseHandle()關(guān)閉串口的句柄就可以了。通信超時:在通信中,超時是個很重要的考慮因素,因為如果在數(shù)據(jù)接收過程中由于某種原因突然中斷或停止,如果不采取超時控制機制,將會使得I/O線程被掛起或無限阻塞。(2)錯誤處理和通信狀態(tài):在串口通信中,可能會產(chǎn)生很多的錯誤,使用ClearCommError()函數(shù)可以檢測錯誤并且清除錯誤條件??稍O(shè)置的通信事件標(biāo)志(即SetCommMask()函數(shù)所設(shè)置的掩碼)可以有EV_BREAK、EV_CTS、EV_DSR、 EV_ERR、EV_RING、EV_RLSD、EV_RXCHAR、EV_RXFLAG、EV_TXEMPTY。創(chuàng)建讀寫線程 ,實現(xiàn)串行通信如圖 2所示 :打開串口配置串口監(jiān)視串口狀態(tài)創(chuàng)建讀線程創(chuàng)建寫線程數(shù)據(jù)顯示關(guān)閉串口接受事件發(fā)生數(shù)據(jù)接收保存通信是否結(jié)束終止線程是否結(jié)束否否是是否主線程是讀線程 圖2多線程實現(xiàn)多串口通信打開并配置完串口后 ,開啟兩個線程 ,一個讀線程和一個寫線程 ,主線程主要負(fù)責(zé)將所有串口接收到的數(shù)據(jù)進行處理顯示以及各個子線程的調(diào)度和管理 ,讀線程負(fù)責(zé)讀取八個串口的數(shù)據(jù) ,寫線程負(fù)責(zé)向需要控制的串