PC機(jī)與PIC單片機(jī)串行通訊的實(shí)現(xiàn)
出處:陳璐超chym 發(fā)布于:2007-04-29 09:21:20
PC機(jī)與PIC單片機(jī)串行通訊的實(shí)現(xiàn)
于萬民,王哈力,鄭洪平
(哈爾濱理工大學(xué) 黑龍江哈爾濱 150040;
2.齊齊哈爾鐵路車輛(集團(tuán))有限責(zé)任公司
黑龍江齊齊哈爾 161002)
隨著計(jì)算機(jī)應(yīng)用技術(shù)和微機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展,計(jì)算機(jī)與其外部設(shè)備之間的數(shù)據(jù)傳輸越發(fā)顯得重要。而串行通訊技術(shù)是實(shí)現(xiàn)這一功能的有效途徑,他具有使用方便、數(shù)據(jù)傳輸可靠、適用于遠(yuǎn)距離通訊的特點(diǎn),在工業(yè)監(jiān)控、數(shù)據(jù)采集、檢測等系統(tǒng)中有著廣泛的應(yīng)用。
1 異步串行通訊的原理及硬件電路的實(shí)現(xiàn)
1.1 異步串行通訊的原理
在異步通訊中,數(shù)據(jù)是一幀一幀傳送的,其數(shù)據(jù)格式如圖1所示。
在幀格式中,一個(gè)字符由4部分組成:起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。首先是一個(gè)起始位"o",然后是5~8位數(shù)據(jù)(規(guī)定低位在前,高位在后),接下來是奇偶校驗(yàn)位(可省略),是停止位"1"。起始位"o"信號只占用1位,用來通知接收設(shè)備一個(gè)待接收的字符開始到來。線路上在不傳送字符時(shí)應(yīng)保持為"廣。接收端不斷檢測線路的狀態(tài),若連續(xù)為"1"以后又檢測到一個(gè)"o",就知道發(fā)來一個(gè)新字符,應(yīng)馬上準(zhǔn)備接收。
1.2 硬件電路的實(shí)現(xiàn)
PC機(jī)與PICl6C711單片機(jī)之間的串行異步通訊采用RS232接口電路實(shí)現(xiàn),利用計(jì)算機(jī)的串行接口進(jìn)行數(shù)據(jù)傳輸。因?yàn)镽S232邏輯電子對地是對稱的,與TTI。,CMOS邏輯電平完全不同。邏輯"1"電平為一5~15V之間,邏輯電平"0"為+5~15V之間,其與單片機(jī)的邏輯電平不一致,必須進(jìn)行電子轉(zhuǎn)換,采用MCl488和MCl489芯片可分別實(shí)現(xiàn)TTL-RS232和RS232-TTL之間的電平轉(zhuǎn)換。接口電路圖如圖2所示。
2 PC機(jī)通訊程序的編制
利用VC++6.0在Windows 98以上的環(huán)境下運(yùn)行,VC實(shí)現(xiàn)串行通訊有3種途徑:
(1)利用MSComm控件,他是Microsoh公司提供的簡化WindOWS串行通訊編程的ActiveX控件,他為應(yīng)用程序提供了處理串行通訊的2種方法:數(shù)據(jù)驅(qū)動(dòng)法和查詢法;
(2)利用Cseria1Pont類進(jìn)行串口通訊,他適合于需要使用多個(gè)串口時(shí)的通訊;
(3)用Win API函數(shù)對串口進(jìn)行操作。
本文以VC++6.0調(diào)用Win API函數(shù)為例編程實(shí)現(xiàn)。Win API函數(shù)對串口進(jìn)行操作不是對端口直接進(jìn)行讀寫,而是把所有的設(shè)備都看成文件,從而進(jìn)行相應(yīng)的文件操作。
第1步,在MainForm.cpp定義全局變量HANDLE hCom;//準(zhǔn)備打開的串口的句柄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ù)實(shí)現(xiàn)非阻塞通訊的關(guān)鍵所在。
ASSERT(hCom! =INVALID HANDLE VALUE);
//檢測打開串口操作是否成功
SetCommMask(hCom,EVRXCHAR IEVTXEMPTY);
//設(shè)置事件驅(qū)動(dòng)的類型
SetupComm(hCom,1024,512); //設(shè)置輸入緩沖區(qū)的大小
PurgeComm (hCom, PURGE TXABORT ︱ PURGE RXABORT︱PURGETXCLEAR︱PURGE RXCLEAR);
//清理輸入輸出緩沖區(qū)
COMMTIMEOUTS Comm丁imeOuts;
//定義超時(shí)結(jié)構(gòu),井填寫該結(jié)構(gòu)
SetCommTimeOuts (hCom,&CommTimesOuts);
//設(shè)置讀寫操作所允許的超時(shí)
DCB dcb; //設(shè)置數(shù)據(jù)控制快的結(jié)構(gòu)
dcb.BaudRate=9600; //設(shè)置波特率
dcb.ByteSze=8;
dcb.StopBits=onestopbit;
dcb.fBinary=TRUE; //二進(jìn)制通訊格式
dcb.fPar北y:FALSE;
SetCommState(Hcom,&dcb) //串口參數(shù)配置
第3步,啟動(dòng)一個(gè)輔助線程,用于串口事件的處理。這里用他來監(jiān)視串口狀態(tài),主線程則可專心進(jìn)行數(shù)據(jù)處理。
HCommWatchThread =CreateThread ((LPSECURITY_ATTRIBUTES) NULL, (LPTHEARD_ START - ROUTINE) CommWatchPROC, GetSafeHwnd ( ),&dwThreadID);
ASSERT(hCommWatchThread! =NULL);
第4步,要為輔助線程寫一個(gè)全局函數(shù),主要完成數(shù)據(jù)接收的工作。
UNIT CommWatchProc(HWND hSendWnd)
{DWORD dwEvtMask=0;
SetCommMask(hCom,EV_RXCHAR︱EV_ _TXEMPTY);
//有哪些串口事件需要監(jiān)視
WaitCommEvent(hCom,&dwEvMask,Os);
//等待串口通訊事件的發(fā)生
If(dwEvtMask&EV_RXCHAR)= =EV_RXCHAR)
//緩沖區(qū)中有數(shù)據(jù)到達(dá)
{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ù)因?yàn)槭褂?pOverlapped結(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];
//準(zhǔn)備好發(fā)送的數(shù)據(jù),放在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單片機(jī)串行通訊的實(shí)現(xiàn)
本文以單片機(jī)對溫度傳感器DSl820進(jìn)行數(shù)據(jù)采集為例,實(shí)現(xiàn)單片機(jī)與PC機(jī)的通訊。限于篇幅,給出傳送一個(gè)DSl820信號到串口的主要部分程序:
A2 EQU 2 //RA2接收數(shù)據(jù)端
A1 EQU 1 //RAl發(fā)送數(shù)據(jù)
RCVREG EQU 26
R-COUNT EQU 27 //接收數(shù)據(jù)計(jì)數(shù)器
T-COUNT EQU 28 //發(fā)送數(shù)據(jù)計(jì)數(shù)器
MSB EQU 7
NUM EQU 6B //設(shè)置下位機(jī)序號67
NUM-ADDR EQU 2A //存儲本機(jī)號碼的地址
SEN-CODE EQU 39 //傳感器信號存放地址
MAIN CALL SUB-INIT //初始化程序
CALL SUB-REC //調(diào)用接收子程序
CALL SUB_ COMP //對接收的數(shù)據(jù)進(jìn)行處理
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)用延時(shí)程序
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é) 語
本文所論述的通訊方法曾在對氣體傳感的在線檢測中應(yīng)用,由于DSl820為數(shù)字傳感器,因此利用單片機(jī)可直接對DSl820操作,將溫度值存儲在單片機(jī)通用寄存器中,通過VC調(diào)用WinAPI函數(shù)對串口讀寫,可將溫度值及氣體傳感器信號采集到PC機(jī)界面,從而實(shí)現(xiàn)對氣體傳感器在不同溫度值下的在線檢測。實(shí)踐證明,利用VC開發(fā)通訊系統(tǒng),從底層到上層直接面向用戶,具有很強(qiáng)的調(diào)試功能,采用文中所述的方式構(gòu)建的通訊在線檢測系統(tǒng)工作穩(wěn)定,數(shù)據(jù)傳輸可靠。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 單片機(jī)技術(shù)特性與嵌入式開發(fā)實(shí)踐指南2026/1/7 10:00:02
- 單片機(jī)(MCU)與數(shù)字信號處理器(DSP)分類及選型技術(shù)指南2025/12/30 10:02:37
- 工業(yè)級DSP信號處理系統(tǒng):硬件適配與抗干擾工程方案2025/12/15 14:41:00
- HOLTEK推出HT32F65533G/733G內(nèi)建N/N預(yù)驅(qū)電機(jī)專用SoC單片機(jī)2025/11/26 14:11:41
- 什么是C51數(shù)據(jù)類型擴(kuò)充定義2025/10/27 13:59:22
- PCB電源完整性(PI)設(shè)計(jì)核心實(shí)操規(guī)范
- 多層PCB疊層設(shè)計(jì)核心實(shí)操規(guī)范
- 提高M(jìn)OSFET效率的電路優(yōu)化方法
- 電源管理IC在智能家居中的應(yīng)用
- 差分信號連接器設(shè)計(jì)要點(diǎn)
- PCB焊盤與過孔設(shè)計(jì)核心實(shí)操規(guī)范(含可焊性與可靠性保障)
- 汽車電子常用電子元器件選型指南
- MOSFET驅(qū)動(dòng)與隔離方案設(shè)計(jì)
- 高溫環(huán)境下電源IC選型建議
- 安防監(jiān)控設(shè)備連接器應(yīng)用分析









