<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > PC機與PIC單片機串行通訊的實現(xiàn)

          PC機與PIC單片機串行通訊的實現(xiàn)

          作者: 時間:2010-08-11 來源:網(wǎng)絡(luò) 收藏

          隨著計算機應用技術(shù)和微機網(wǎng)絡(luò)技術(shù)的發(fā)展,計算機與其外部設(shè)備之間的數(shù)據(jù)傳輸越發(fā)顯得重要。而串行通訊技術(shù)是實現(xiàn)這一功能的有效途徑,他具有使用方便、數(shù)據(jù)傳輸可靠、適用于遠距離通訊的特點,在工業(yè)監(jiān)控、數(shù)據(jù)采集、檢測等系統(tǒng)中有著廣泛的應用。

          1 異步串行通訊的原理及硬件電路的實現(xiàn)
          1.1 異步串行通訊的原理

          在異步通訊中,數(shù)據(jù)是一幀一幀傳送的,在幀格式中,一個字符由4部分組成:起始位、數(shù)據(jù)位、奇偶校驗位和停止位。首先是一個起始位"o",然后是5~8位數(shù)據(jù)(規(guī)定低位在前,高位在后),接下來是奇偶校驗位(可省略),最后是停止位"1"。起始位"o"信號只占用1 位,用來通知接收設(shè)備一個待接收的字符開始到來。線路上在不傳送字符時應保持為"廣。接收端不斷檢測線路的狀態(tài),若連續(xù)為"1"以后又檢測到一個"o",就知道發(fā)來一個新字符,應馬上準備接收。

          1.2 硬件電路的實現(xiàn)

            與PICl6C711單片機之間的串行異步通訊采用RS232接口電路實現(xiàn),利用計算機的串行接口進行數(shù)據(jù)傳輸。因為RS232邏輯電子對地是對稱的,與TTI。,CMOS邏輯電平完全不同。邏輯"1"電平為一5~15V之間,邏輯電平"0"為+ 5~15V之間,其與單片機的邏輯電平不一致,必須進行電子轉(zhuǎn)換,采用MCl488和MCl489芯片可分別實現(xiàn)TTL-RS232和RS232-TTL 之間的電平轉(zhuǎn)換。接口電路圖如圖2所示。

          2 通訊程序的編制

          利用VC++6.0在Windows 98以上的環(huán)境下運行,VC實現(xiàn)串行通訊有3種途徑:

          (1)利用MSComm控件,他是Microsoh公司提供的簡化WindOWS串行通訊編程的ActiveX控件,他為應用程序提供了處理串行通訊的2種方法:數(shù)據(jù)驅(qū)動法和查詢法;
          (2)利用Cseria1Pont類進行串口通訊,他適合于需要使用多個串口時的通訊;
          (3)用Win API函數(shù)對串口進行操作。

            本文以VC++6.0調(diào)用Win API函數(shù)為例編程實現(xiàn)。Win API函數(shù)對串口進行操作不是對端口直接進行讀寫,而是把所有的設(shè)備都看成文件,從而進行相應的文件操作。

            第1步,在MainForm.cpp定義全局變量HANDLE hCom;//準備打開的串口的句柄HANDLEh Comm WatchThread;//輔助線程的全局函數(shù)

            第2步,打開串口,設(shè)置串口hCom=CreateFile(〞COMl〞, GENERIC_READ︱GENERIC_WRITE,NULL, OPEN_EXISTING, FILE_ FLAG_OVERLAPPED,NULL);//這里,我們使用FILE_FLAG_OVERLAPPED結(jié)構(gòu),這正是使用API函數(shù)實現(xiàn)非阻塞通訊的關(guān)鍵所在。

          ASSERT(hCom! =INVALID HANDLE VALUE);
          //檢測打開串口操作是否成功
          SetCommMask(hCom,EVRXCHAR IEVTXEMPTY);
          //設(shè)置事件驅(qū)動的類型
          SetupComm(hCom,1024,512); //設(shè)置輸入緩沖區(qū)的大小
          PurgeComm (hCom, PURGE TXABORT ︱ PURGE RXABORT︱PURGETXCLEAR︱PURGE RXCLEAR);
          //清理輸入輸出緩沖區(qū)
          COMMTIMEOUTS Comm丁imeOuts;
          //定義超時結(jié)構(gòu),井填寫該結(jié)構(gòu)
          SetCommTimeOuts (hCom,CommTimesOuts);
          //設(shè)置讀寫操作所允許的超時
          DCB dcb; //設(shè)置數(shù)據(jù)控制快的結(jié)構(gòu)
          dcb.BaudRate=9600; //設(shè)置波特率
          dcb.ByteSze=8;
          dcb.StopBits=onestopbit;
          dcb.fBinary=TRUE; //二進制通訊格式
          dcb.fPar北y:FALSE;
          SetCommState(Hcom,dcb) //串口參數(shù)配置

            第3步,啟動一個輔助線程,用于串口事件的處理。這里用他來監(jiān)視串口狀態(tài),主線程則可專心進行數(shù)據(jù)處理。

          HCommWatchThread =CreateThread ((LPSECURITY_ATTRIBUTES) NULL, (LPTHEARD_ START - ROUTINE) CommWatchPROC, GetSafeHwnd ( ),dwThreadID);
          ASSERT(hCommWatchThread! =NULL);
            第4步,要為輔助線程寫一個全局函數(shù),主要完成數(shù)據(jù)接收的工作。

          UNIT CommWatchProc(HWND hSendWnd)
          {DWORD dwEvtMask=0;
          SetCommMask(hCom,EV_RXCHAR︱EV_ _TXEMPTY);
          //有哪些串口事件需要監(jiān)視
          WaitCommEvent(hCom,dwEvMask,Os);
          //等待串口通訊事件的發(fā)生
          If(dwEvtMaskEV_RXCHAR)= =EV_RXCHAR)
          //緩沖區(qū)中有數(shù)據(jù)到達
          {COMSTART ComStari;
          DWORD dwLenlgth;
          ClearCommError(hCom,dwErrorFlags,ComStart);
          DwLength=ComStat.cbInQuei ; //輸入緩沖區(qū)有多少數(shù)據(jù)
          If(dwLenlTth>0)
          {BOOL fReadStari
          fReadStat = =ReadFile (hCom, 1pBuffer,dwLength,
          dwBytesRead,,Read_OS(npTTYInfO));
          //讀數(shù)據(jù)因為使用1pOverlapped結(jié)構(gòu),ReadFile()立即返回
          FALSE;
          If(! fReadStat)
          {if(GetLastError()= =ERROR_IO_PENDIN)
          {while (! GetOverLappedReault (hCom,READ_OS
          (opTTYInfo),dwNytesRead,TRUE)
          {dWError=GetlastError();
          if(dwError==ERROR_IO_INCOMPLETE)
          CONTINUE; //緩沖區(qū)數(shù)據(jù)沒有讀完,繼續(xù)
          ……}
          ∷ PostMessage (( HWND ) hSendWnd, WM
          NOTIFYPROCESS,0,0); //通知主線程,串口接到數(shù)據(jù)}

            第5步,在主線程中發(fā)送下行命令:

          BOOL f WriteStat;
          Char szBuffer[count];
          //準備好發(fā)送的數(shù)據(jù),放在szBuffer[]中
          FWrirteStar=WriteFile(hCom,szBuffer,dwbytesToWrite,
          dwBytesWrittenWRITE_OS(npTTYInof));
          int err=GetLastError();
          if(!fWriteStat){if(GetLastError()= =ERROR_IO_PENDING)
          {while (! GetOverlappedResult (hCom,WRITE OS
          (npTTYInfO),dwBytesWritten,true))
          {dwError=GetLasrError();
          if(dwError= =ERROR_IO_INCOMPLETE)
          {dwBytesSent+=dwbytesWritten;
          continue;))}}

          3 PIC"C711單片機串行通訊的實現(xiàn)

            本文以單片機對溫度傳感器DSl820進行數(shù)據(jù)采集為例,實現(xiàn)單片機與的通訊。限于篇幅,給出傳送一個DSl820信號到串口的主要部分程序:

          A2 EQU 2 //RA2接收數(shù)據(jù)端
          A1 EQU 1 //RAl發(fā)送數(shù)據(jù)
          RCVREG EQU 26
          R-COUNT EQU 27 //接收數(shù)據(jù)計數(shù)器
          T-COUNT EQU 28 //發(fā)送數(shù)據(jù)計數(shù)器
          MSB EQU 7
          NUM EQU 6B //設(shè)置下位機序號67
          NUM-ADDR EQU 2A //存儲本機號碼的地址
          SEN-CODE EQU 39 //傳感器信號存放地址
          MAIN CALL SUB-INIT //初始化程序
          CALL SUB-REC //調(diào)用接收子程序
          CALL SUB_ COMP //對接收的數(shù)據(jù)進行處理
          CALL
          SUB_TRANS //發(fā)送數(shù)據(jù)子程序
          GOTO
          EXIT
          SUB_INITCLRF RA
          BCF STATUS,RP0
          MOVLW B'00001101' //初始化MOVWF
          TRISA
          MOVLW NUM
          MOVWF NUM
          RETURN
          SUB-REC
          RCVR BTFSCRA,A2 //檢測起始位
          GOTO RCVR // 未檢測到
          MOVL W2 //接收的數(shù)據(jù)位數(shù)
          MOVWF R_COUN
          R_NEXTCALL DELAY //調(diào)用延時程序
          BCF STATUS,C
          RRF RCVREG
          BTFSC RA,A2
          BSF RCVREG,MSB
          CALL DELAY
          DECFSZ R_COUNT
          GOTO R_NEXT
          RETURN
          SUB_COMPMOVLW 6A
          MOVWF CONT
          MOVFCONT,W
          XORWF NUM_ADDR,1 MOVLW
          1 ;
          ADDWF NUM_ADDR,1 DECFSZ
          NUM-ADDR,1
          GOTO EXIT
          NOP
          OVERNOP
          RETURN
          SUB_TRANSMOVLW 3 //發(fā)送的數(shù)據(jù)位數(shù)
          MOVWF T_ COUNT
          MOVLW 2A
          MOVWF SEN_CODE
          BCF RA,A1 //設(shè)置發(fā)送起始位0
          T_NEXTCALL DELAY
          RRF SEN_CODE
          BTFSC STATUS,C
          BSF RA,A1 //發(fā)送數(shù)據(jù)位"1"
          BTFSS STATUS,C
          BCF RA,A1 //發(fā)送數(shù)據(jù)位"0"
          DECFS2T_COUNT
          GOTO T_NEXT
          CALL DELAY
          BSF RA,A1 //發(fā)送停止位
          RETURN
          EXITNOP
          END

          4 結(jié) 語

          本文所論述的通訊方法曾在對氣體傳感的在線檢測中應用,由于DSl820為數(shù)字傳感器,因此利用單片機可直接對 DSl820操作,將溫度值存儲在單片機通用寄存器中,通過VC調(diào)用WinAPI函數(shù)對串口讀寫,可將溫度值及氣體傳感器信號采集到PC機界面,從而實現(xiàn)對氣體傳感器在不同溫度值下的在線檢測。實踐證明,利用VC開發(fā)通訊系統(tǒng),從底層到上層直接面向用戶,具有很強的調(diào)試功能,采用文中所述的方式構(gòu)建的通訊在線檢測系統(tǒng)工作穩(wěn)定,數(shù)據(jù)傳輸可靠。



          關(guān)鍵詞: 串行通信 PC機 PIC單片機

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();