freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

單片機(jī)msp430與pc機(jī)串口通訊設(shè)計(jì)(編輯修改稿)

2025-07-26 21:59 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 模塊程序流程圖接收中斷服務(wù)程序 當(dāng)有數(shù)據(jù)收到時(shí),設(shè)置一個(gè)標(biāo)志通知主程序有數(shù)據(jù)到來(lái),當(dāng)?shù)刂肺或?yàn)證無(wú)誤后,則開(kāi)始接收數(shù)據(jù)。下面為接收中斷處理程序代碼:interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void){if(URCTL1amp。URXWIE) //接收為地址方式時(shí)等待正確的地址出現(xiàn){if(URBUF_1==ADDRESS) //地址正確,改變接收為數(shù)據(jù)方式,準(zhǔn)備接收 { URCTL1amp。=~URXWIE;nRX1_Len_temp = 0。 } }else //接收為數(shù)據(jù)時(shí){UART1_RX_BUF[nRX1_Len_temp] = RXBUF1。//數(shù)據(jù)存入U(xiǎn)ART1_RX_BUF里 nRX1_Len_temp += 1。 if(UART1_RX_BUF[nRX1_Len_temp ++]== 0) //是否到達(dá)停止位{ nRX1_Len = nRX1_Len_temp。 nRev_UART1 = 1。 //設(shè)置標(biāo)志來(lái)通知主程序nRX1_Len_temp = 0。URCTL1 |=URXWIE; //數(shù)據(jù)收完改變?yōu)榈刂贩绞? }} 對(duì)于接收中斷,程序處于等待狀態(tài),當(dāng)外面有數(shù)據(jù)到來(lái)時(shí)則觸發(fā)接收,進(jìn)入接收中斷服務(wù)程序,當(dāng)?shù)刂夫?yàn)證正確開(kāi)始后面的數(shù)據(jù),中斷從“RxBUF1”寄存器里讀取數(shù)據(jù),將讀到的數(shù)據(jù)放到“UART1_RX_BUF[ ]”全局緩沖區(qū)里,在接收數(shù)據(jù)之后設(shè)置一個(gè)標(biāo)志“nRev_UART1”來(lái)通知主程序,完成后等待下一中斷的到來(lái)。接收中斷服務(wù)程序包含了對(duì)地址位是否匹配的驗(yàn)證。發(fā)送中斷服務(wù)程序 當(dāng)主程序有數(shù)據(jù)要發(fā)送時(shí),設(shè)置一個(gè)中斷標(biāo)志進(jìn)入中斷并發(fā)送數(shù)據(jù)。下面為程序代碼:interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void){ if(nTX1_Len != 0) { nTX1_Flag = 0。 // 表示緩沖區(qū)里的數(shù)據(jù)沒(méi)有發(fā)送完 TXBUF1==0x01。 //先寫(xiě)入地址字符 TXBUF1 = UART1_TX_BUF[nSend_TX1]。 //開(kāi)始傳輸數(shù)據(jù) nSend_TX1 += 1。 if(nSend_TX1 = nTX1_Len) //數(shù)據(jù)是否發(fā)送完 { nSend_TX1 = 0。 nTX1_Len = 0。 nTX1_Flag = 1。 //緩沖區(qū)里沒(méi)有數(shù)據(jù)要發(fā)送了 }} }對(duì)于發(fā)送中斷,程序一般處于禁止等待狀態(tài)。只有當(dāng)單片機(jī)的發(fā)送緩沖區(qū)歷由數(shù)據(jù)需要發(fā)送,并將發(fā)送中斷置為允許方式后,發(fā)送中斷才開(kāi)始工作。發(fā)送時(shí)從緩沖區(qū)里發(fā)送數(shù)據(jù),遵守通訊協(xié)議:首先發(fā)送地址位,然后發(fā)送需要傳輸?shù)臄?shù)據(jù),最后發(fā)送校驗(yàn)以及結(jié)束標(biāo)志。在發(fā)送中斷服務(wù)程序里從“UART1_TX_BUF[ ]”全局緩沖區(qū)里取出數(shù)據(jù)給“TXBUF1”寄存器進(jìn)行發(fā)送,發(fā)送完后發(fā)送中斷服務(wù)程序等待下一中斷的到來(lái)。以上兩程序可以看出采用中斷有很好的結(jié)構(gòu),只要在中斷服務(wù)程序里理接收和發(fā)送數(shù)據(jù),然后與主程序進(jìn)行數(shù)據(jù)交換,易實(shí)現(xiàn)多任務(wù)操作,很好利用單片機(jī)資源。五、主處理程序主處理程序包含初始化、設(shè)置串口工作方式、對(duì)接收到的數(shù)據(jù)進(jìn)行處理以及封裝需要發(fā)送的數(shù)據(jù)。下面是它的程序代碼。include include //定義串口操作變量char nRev_UART1。 // 串口 1 的接收標(biāo)志char UART1_TX_BUF[60]。 // 串口 1 的發(fā)送緩沖區(qū)char UART1_RX_BUF[60]。 // 串口 1 的接收緩沖區(qū) int nTX1_Len。char nRX1_Len。char nRX1_Len_temp。char nTX1_Flag。int nSend_TX1。void main(void){ int nRes_UART1。 int nRes = 0。 char UART1_RX_Temp[60]。 int i。 int n。 WDTCTL = WDTPW + WDTHOLD。 // 關(guān)閉看門(mén)狗 _DINT()。 // 關(guān)閉中斷 Init_CLK()。 // 初始化時(shí)鐘 Init_Port()。 // 初始化端口 Init_UART1()。 // 初始化串口1 _EINT()。 // 打開(kāi)中斷 for(。) // 進(jìn)入處理循環(huán){ if(nRev_UART1 == 1) //如果有接收中斷{ nRev_UART1 = 0。 for(i = 0。i nRX1_Len。i++) UART1_RX_Temp[i] = UART1_RX_BUF[i]。 // 將接收到的數(shù)據(jù)拷貝到臨時(shí)緩沖區(qū)。 nRes = ProcessCMD(UART1_RX_Temp,nRX1_Len)。 switch(nRes) { case 1: UART1_TX_BUF[0] = 39。O39。 UART1_TX_BUF[1] = 39。K39。 UART1_TX_BUF[2] = 13。 nTX1_Len = 3。 // 設(shè)置中斷標(biāo)志,進(jìn)入發(fā)送中斷程序 IFG2 |= UTXIFG1。 nRX1_Len = 0。 break。 case 2: for(n = 0。n nRX1_Len。n++) UART1_TX_BUF[n] = UART1_RX_Temp[n]。 UART1_TX_BUF[nRX1_Len] = 39。O39。 UART1_TX_BUF[nRX1_Len+1] = 39。K39。 UART1_TX_BUF[nRX1_Len+2] = 13。 nTX1_Len = nRX1_Len + 3。 // 設(shè)置中斷標(biāo)志,進(jìn)入發(fā)送中斷程序 IFG2 |= UTXIFG1。 nRX1_Len = 0。 break。 case 1: UART1_TX_BUF[0] = 39。E39。 UART1_TX_BUF[1] = 39。R39。 UART1_TX_BUF[2] = 39。R39。 UART1_TX_BUF[3] = 39。O39。 UART1_TX_BUF[4] = 39。R39。 UART1_TX_BUF[5] = 13。 nTX1_Len = 6。 // 設(shè)置中斷標(biāo)志,進(jìn)入發(fā)送中斷程序 IFG2 |= UTXIFG1。 nRX1_Len = 0。 break。 } } }}在上面的程序中主要根據(jù)“ProcessCMD(UART1_RX_Temp,nRX1_Len)”對(duì)得到的結(jié)果進(jìn)行處理,向PC發(fā)送響應(yīng)數(shù)據(jù),如果接收到的數(shù)據(jù)有錯(cuò)誤,則發(fā)送“ERROR”。數(shù)據(jù)封裝完成后,設(shè)置“nTx1_Len”的長(zhǎng)度,并通過(guò)“IFG2 |= UTXIFG1。”發(fā)送中斷,“ProcessCMD(UART1_RX_Temp,nRX1_Len)”主要處理接收到的數(shù)據(jù)并返回相應(yīng)的代碼以使主程序處理。該函數(shù)的具體代碼為:int ProcessCMD(char pBuf[],int nLen){ int nTemp = 1。 int i。 if(nLen = 2) return 1。 if (nLen == 5) { if((pBuf[0] == 39。A39。) amp。amp。 (pBuf[1] == 39。T39。) amp。amp。 (pBuf[2] == 39。E39。) amp。amp。 (pBuf[3] == 39。039。)) nTemp = 1。 if((pBuf[0] == 39。A39。) amp。amp。 (pBuf[1] == 39。T39。) amp。amp。 (pBuf[2] == 39。E39。) amp。amp。 (pBuf[3] == 39。139。)) nTemp = 2。 } return nTemp。}167。 上位機(jī)(PC機(jī))程序設(shè)計(jì)一、上位機(jī)串口通訊編程方法的選擇隨著Windows在國(guó)內(nèi)的普及,越來(lái)越多的微機(jī)用戶轉(zhuǎn)向了Windows操作系統(tǒng),所以在DOS環(huán)境下利用匯編語(yǔ)言和C語(yǔ)言對(duì)串口通信的編程方式已經(jīng)不再被看好。在Windows操作系統(tǒng)下利用VC++,其軟件界面非常方便友好,編程工作量相對(duì)較小,只需進(jìn)行主要應(yīng)用功能的編程和少量界面控制的編程[12]。在Windows環(huán)境下,利用PC機(jī)串口進(jìn)行通信的常用方法有以下幾種:一是利用Windows API通信函數(shù);二是利用VC的標(biāo)準(zhǔn)通信函數(shù)_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接對(duì)串口進(jìn)行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方編寫(xiě)的通信類[13]。本設(shè)計(jì)將介紹用PComm開(kāi)發(fā)PC機(jī)與單片機(jī)的通信程序的解決方案。二、Pm主要命令碼PComm( Professional Comm Tool for PC) 串口通信軟件包專門(mén)運(yùn)用Windows NT/2000/XP。如今WindowsNT/2000/XP 已被廣泛應(yīng)用, 而它提供的Win32Comm API 卻復(fù)雜難用, 而且沒(méi)有提供如Zmodem 等高階應(yīng)用函數(shù), 這增加了通信軟件工程師的負(fù)擔(dān)。針對(duì)這種狀況, MOXA開(kāi)發(fā)了一套簡(jiǎn)單易用的程式函數(shù)庫(kù)及功能強(qiáng)大的輔助工具—PComm。PComm Pro支持多種編程語(yǔ)言,如Visual Basic、VC++、Delphi 等,并且適用于任何在Windows NT/2000/XP下以Win 32 COMMAPI 為基礎(chǔ)的驅(qū)動(dòng)程式的其他品牌的多串口卡[14]。PComm的主要命令碼有以下幾種[15]:(1) sioopen(port);用于設(shè)置并打開(kāi)串口,其中port的4分別代表COM、COMCOMCOM4。當(dāng)返回值為0時(shí),表示串口已經(jīng)打開(kāi),否則為串口打開(kāi)出錯(cuò)。(2) sio close(port);關(guān)閉串口,當(dāng)返回值為0時(shí),表示串口已經(jīng)關(guān)閉,否則為串口關(guān)閉出錯(cuò)。(3) sio ioctl (port baud mode )。用于設(shè)置串口波特率、校驗(yàn)位、數(shù)據(jù)位、停止位等參數(shù)。(4) sio getch();從串口輸入緩沖區(qū)讀出一個(gè)字符,返回值為0表示已收到數(shù)據(jù)。(5) sioread(port buf len);用于從串口輸入緩沖區(qū)讀出一串字符,buf代表字符串?dāng)?shù)組len代表數(shù)組長(zhǎng)度,返回值為0表示未收到字符,大于0代表收到字符的個(gè)數(shù)。(6) sioSetReadTimeouts port TotalTimeouts(IntervalTimeouts)。 在設(shè)定的等待時(shí)間內(nèi)連續(xù)讀串口輸入緩沖區(qū),TotalTimeouts代表設(shè)定的等待時(shí)間,IntervalTimeouts代表每次讀出的間隔時(shí)間。(7) sioflush(port func);用于清空緩沖區(qū)。當(dāng)func為0時(shí)清空輸入緩沖區(qū),為1時(shí)清空輸出緩沖區(qū),為2時(shí)清空輸入輸出緩沖區(qū)。(8) sioputch (port term);用于向串口緩沖區(qū)發(fā)送一個(gè)字符,返回值為0時(shí)表示發(fā)送正確,否則表示發(fā)送錯(cuò)誤。(9) sio write(port buf len);用于從串口緩沖區(qū)發(fā)送一串字符,buf代表字符串?dāng)?shù)組,len代表數(shù)組長(zhǎng)度。三、上位機(jī)(PC機(jī))通信協(xié)議分布式控制系統(tǒng)中的每臺(tái)下位機(jī)均有唯一的地址。PC機(jī)發(fā)送數(shù)據(jù)時(shí)先發(fā)送被叫單片機(jī)地址,被叫單片機(jī)對(duì)地址進(jìn)行判斷,地址錯(cuò)誤就不予理睬,地址正確則向上位機(jī)發(fā)送呼叫應(yīng)答信號(hào)[16]。PC機(jī)在接收到呼叫應(yīng)答信號(hào)之后,將向單片機(jī)發(fā)出通信命令字符串。以下是上位機(jī)(PC機(jī))的通訊協(xié)議格式。表32 上位機(jī)通訊協(xié)議格式單片機(jī)號(hào)單片機(jī)號(hào)命令碼命令碼停止標(biāo)志其中,單片機(jī)號(hào)代表現(xiàn)場(chǎng)第幾臺(tái)單片機(jī),占用1個(gè)字節(jié),發(fā)送兩次的目的是為了防止干擾;命令碼則代表上位機(jī)向下位機(jī)發(fā)布的工作命令,它也占用1個(gè)字節(jié),發(fā)送兩次的目的也是為了防止干擾。而停止標(biāo)志則表明上位機(jī)一次命令發(fā)送完畢,使用時(shí)可依據(jù)該標(biāo)志判斷上位機(jī)的命令是否發(fā)送完畢。四、上位機(jī)串口通訊實(shí)現(xiàn)過(guò)程在用PComm處理PC機(jī)的串口通信時(shí),其實(shí)現(xiàn)過(guò)程如下:?jiǎn)?dòng)VC++,新建一個(gè)基于對(duì)話框的應(yīng)用程序TxRx。同時(shí)增加靜態(tài)文本、編輯框和按鈕等控件[17]。如圖33所示。圖33 基于對(duì)話框的接收發(fā)送數(shù)據(jù)程序根據(jù)實(shí)際需要還可以添加更多控件,諸如串口的打開(kāi)和關(guān)閉按鈕,波特率選擇框以及一些實(shí)現(xiàn)更加高級(jí)功能的控件等,在這里僅添加基本的發(fā)送接收等按鈕控件。按照表33為每個(gè)控
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1