国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

PC機與PIC單片機串行通訊的實現

發布時間:2010-11-5 19:53    發布者:techshare
關鍵詞: PC機 , PIC , 串行通訊 , 單片機
隨著計算機應用技術和微機網絡技術的發展,計算機與其外部設備之間的數據傳輸越發顯得重要。而串行通訊技術是實現這一功能的有效途徑,他具有使用方便、數據傳輸可靠、適用于遠距離通訊的特點,在工業監控、數據采集、檢測等系統中有著廣泛的應用。

1 異步串行通訊的原理及硬件電路的實現

1.1 異步串行通訊的原理

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

1.2 硬件電路的實現

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

2 PC機通訊程序的編制

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

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

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

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

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

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

第3步,啟動一個輔助線程,用于串口事件的處理。這里用他來監視串口狀態,主線程則可專心進行數據處理。

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

UNIT CommWatchProc(HWND hSendWnd)
{DWORD dwEvtMask=0;
SetCommMask(hCom,EV_RXCHAR︱EV_ _TXEMPTY);
//有哪些串口事件需要監視
WaitCommEvent(hCom,&dwEvMask,Os);
//等待串口通訊事件的發生
If(dwEvtMask&EV_RXCHAR)= =EV_RXCHAR)
//緩沖區中有數據到達
{COMSTART ComStari;
DWORD dwLenlgth;
ClearCommError(hCom,&dwErrorFlags,&ComStart);
DwLength=ComStat.cbInQuei ; //輸入緩沖區有多少數據
If(dwLenlTth>0)
{BOOL fReadStari
fReadStat = =ReadFile (hCom, 1pBuffer,dwLength,
&dwBytesRead,,&Read_OS(npTTYInfO));
//讀數據因為使用1pOverlapped結構,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; //緩沖區數據沒有讀完,繼續
……}
∷ PostMessage (( HWND ) hSendWnd, WM
NOTIFYPROCESS,0,0); //通知主線程,串口接到數據}

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

BOOL f WriteStat;
Char szBuffer[count];
//準備好發送的數據,放在szBuffer[]中
FWrirteStar=WriteFile(hCom,szBuffer,dwbytesToWrite,
&dwBytesWritten&WRITE_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單片機串行通訊的實現

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

A2 EQU 2 //RA2接收數據端
A1 EQU 1 //RAl發送數據
RCVREG EQU 26
R-COUNT EQU 27 //接收數據計數器
T-COUNT EQU 28 //發送數據計數器
MSB EQU 7
NUM EQU 6B //設置下位機序號67
NUM-ADDR EQU 2A //存儲本機號碼的地址
SEN-CODE EQU 39 //傳感器信號存放地址
MAIN CALL SUB-INIT //初始化程序
CALL SUB-REC //調用接收子程序
CALL SUB_ COMP //對接收的數據進行處理
CALL
SUB_TRANS //發送數據子程序
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 //接收的數據位數
MOVWF R_COUN
R_NEXTCALL DELAY //調用延時程序
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 //發送的數據位數
MOVWF T_ COUNT
MOVLW 2A
MOVWF SEN_CODE
BCF RA,A1 //設置發送起始位0
T_NEXTCALL DELAY
RRF SEN_CODE
BTFSC STATUS,C
BSF RA,A1 //發送數據位"1"
BTFSS STATUS,C
BCF RA,A1 //發送數據位"0"
DECFS2T_COUNT
GOTO T_NEXT
CALL DELAY
BSF RA,A1 //發送停止位
RETURN
EXITNOP
END

4 結 語

本文所論述的通訊方法曾在對氣體傳感的在線檢測中應用,由于DSl820為數字傳感器,因此利用單片機可直接對 DSl820操作,將溫度值存儲在單片機通用寄存器中,通過VC調用WinAPI函數對串口讀寫,可將溫度值及氣體傳感器信號采集到PC機界面,從而實現對氣體傳感器在不同溫度值下的在線檢測。實踐證明,利用VC開發通訊系統,從底層到上層直接面向用戶,具有很強的調試功能,采用文中所述的方式構建的通訊在線檢測系統工作穩定,數據傳輸可靠。
本文地址:http://m.qingdxww.cn/thread-36885-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久热国产在线 | free俄罗斯性xxxxho| 黄工厂精品视频在线观看 | 久久久久免费精品视频 | 免费黄色欧美视频 | 久久婷婷大香萑太香蕉a | 国产欧美成人免费观看视频 | 久久金8天国| 在线港台四级 | 免费毛片网站在线观看 | 日日摸夜夜添夜夜免费视 | 成人伊人青草久久综合网破解版 | 国产一区 在线播放 | 天天久 | 91污网站 | 久久在视频 | 天空之城动漫在线观看完整版免费 | 日韩欧美在线观看视频一区二区 | 亚洲综合在线播放 | 伊人婷婷色香五月综合缴激情 | 向日葵app看片版免费观看 | 亚洲性一级理论片在线观看 | 五月天色婷婷在线 | 毛片免费观看 | 美国免费视频 | 日日操综合 | 欧美人成在线 | 久久精品亚瑟全部免费观看 | 操操操综合网 | 国产日韩在线观看视频网站 | 欧美日韩三区 | 91欧美| 免费国产成人高清在线观看不卡 | 99精品国产福利在线观看 | 2019精品国产品免费观看软件 | 人妖大乳 | 亚洲欧美日韩在线线精品 | 国产99久9在线视频 国产99久9在线 | 欧美手机在线观看 | 女同在线播放 | 国产精品午夜免费观看网站 |