PC與單片機的串行通信及數(shù)據(jù)處理
引言
Matlab是由美國Mathworks公司開發(fā)的面向理論分析研究、工程計算數(shù)據(jù)處理和緩圖的一套具有強大功能的軟件系統(tǒng)。其中Matlab語言是一種以矩陣為基本運算單元的解釋執(zhí)行的高級語言,編程簡例,只要幾條語句就能實現(xiàn)諸如FFT變換、FIR/IIR濾波等數(shù)據(jù)分析處理,易于掌握。從Matlab6.0版本開始,Mathworks公司在軟件中增加了設(shè)備控制箱(instrument control toolbox),提供了對RS-232/RS-485通信標準的串口通信的正式支持。利用該工具箱的serial類及instrcallback()回調(diào)函數(shù),能可靠地進行實時串地通信。為此,筆者充分結(jié)合單片機和Matlab的優(yōu)點,基于事件驅(qū)動的中斷通信機制,提出了一種Matlab環(huán)境下PC機與單片機實時串行通信的數(shù)據(jù)處理方法,極大地簡化開發(fā)流程,提高了系統(tǒng)開發(fā)效率。另外,與目前普遍采用的基于Matlab查詢方式下的非實時串行通信技術(shù)相比,這種方法的實用性也大大增強了。
1 系統(tǒng)總體設(shè)計簡介
下面以Mircochip公司的PIC16F876單片機為下位機,PC機為上位機組成的實時數(shù)據(jù)采集處理系統(tǒng)為例,介紹基于Matlab環(huán)境下PC機與單片機串行通信的實時數(shù)據(jù)處理方法的實現(xiàn)。數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)框圖如圖1所示。PC機串口與單片機USART口通過MAX232電平轉(zhuǎn)換芯片相連,系統(tǒng)工作時,Matlab通過調(diào)用設(shè)備控制工具箱中的serial類及相關(guān)函數(shù)。來創(chuàng)建串口設(shè)備對象,得到設(shè)備的文件句柄,從而以操作文件的方式實現(xiàn)對PC機串行口的讀寫操作。因而PC機可以通過Matlab向串行口發(fā)送特殊指令,PIC單片機應(yīng)用系統(tǒng)對此作出相應(yīng)的反應(yīng),將A/D采樣數(shù)據(jù)通過串行口回送給PC機。此時,Matlab通過中斷的方式,實時接收單片機發(fā)送的數(shù)據(jù),并完成對數(shù)據(jù)的分析處理、文件存儲、FIR濾波及圖形顯示。
2 PIC16F876與PC機串行通信接口的設(shè)計
2.1 PIC16F876單片機串行通信接口的硬件設(shè)計
PIC16F876微處理器芯片內(nèi)部集成了一個串行通信(SCI)模塊。該模塊是一個通用的同步/異步收發(fā)(USART)通信接口。
PIC16F876的SCI通信接口有兩個外部引腳——RC6/TX(SCI發(fā)送輸出引腳)和RC7/RX(SCI接收輸入引腳),引腳的信號電平為TTL類型;而PC機串口的異步串行通信基于RS232標準。兩者通信信號的邏輯電平不一致,必須進行信號電平轉(zhuǎn)換。為此,在電路中選用Maxim公司的MAX232芯片,以實現(xiàn)TTL電平與RS-232電平的雙向轉(zhuǎn)換。RS-232通信距離一般以不超過12m為宜,在工業(yè)控制現(xiàn)場很受限制。為保證硬件設(shè)計的兼容性和易擴展性,能夠應(yīng)用于不同場合,考慮到實際應(yīng)用的需要,在硬件電路中還可選用一個MAX491芯片,添加了一個RS-485通信接口。
如圖2所示,實際使用過程中,系統(tǒng)可以根據(jù)需要,靈活使用不同的通信標準,十分方便。當PIC單片機SCI通信接口引腳直接通過MAX232芯片與PC機串口相連時,系統(tǒng)采用RS-232的通信標準;當PIC單片機SCI通信接口口引腳與MAX489芯片的DI、RO引腳相連時,系統(tǒng)采用RS-485的通信標準。另外,還可通過PIC單片機控制MAX489芯片的DE、RE引腳,隨時使能或屏蔽掉MAX489的數(shù)據(jù)接收和數(shù)據(jù)發(fā)送功能。
2.2 PIC16F876與PC機串行通信接口的軟件設(shè)計
本通信系統(tǒng)中規(guī)定的字符格式為:每一幀的數(shù)據(jù)占10位——1位起始位,8位數(shù)據(jù)位,1位停止位,無奇偶校驗位。中間的8位數(shù)據(jù)位即為有效的通信傳輸字節(jié)。雙方的波特率設(shè)置為115.2kb/s,以較高速度進行通信。同時,為了增強通信的可靠性、減少通信的誤碼率,在通信過程中約定了雙方的軟件握手方法。為了不致使通信過于復(fù)雜,提高通信速度,可以直接將握手信號0xFF嵌入到數(shù)據(jù)包中。軟件握手協(xié)議規(guī)定如下:PC機發(fā)送符合握手信號0xFF給單片機,PIC單片機接收到的上位機數(shù)據(jù)若為握手信號0xFF,則回送兩次A/D采樣數(shù)據(jù)包,并將握手信號0xFF嵌入到數(shù)據(jù)包作為第一個數(shù)據(jù),兩次發(fā)送數(shù)據(jù)的時間間隔為5ms;單片機接收到的上位機數(shù)據(jù)若不是握手信號,則繼續(xù)等待。若PC機接收到的數(shù)據(jù)包的第1個字節(jié)不是0xFF,則屏棄該數(shù)據(jù)包;若是,則表示握手成功,經(jīng)校驗正確后將該數(shù)據(jù)包直接存儲接收,并從中分解有效的A/D采樣數(shù)據(jù)信息。
[next]
PIC16F876端串行通信的C語言程序流程如圖3所示,相應(yīng)的主要通信源代碼如下:
//串口相關(guān)寄存器的初始化子程序void sci_initial(){SPBRG=0C0A; //設(shè)置通信波特率為115.2kb/sTXSTA=0X04; //選擇異步高速通信模式RCSTA=0x80; //串行口使能,接收數(shù)據(jù)長度為8位,無奇偶校驗TRISC6=0; //RC6引腳設(shè)置為輸出方式TRISC7=1; //PC7引腳設(shè)置為輸入方式}//串口接收和發(fā)送數(shù)據(jù)子程序void sci_com(){while(!RCIF); //查詢接收中斷標志位,等待上位機發(fā)送的串口數(shù)據(jù)rec_data[0]=RCREG;//接收串口數(shù)據(jù)if(rec_data[0]==0xFF){send_data[0]=rec_data[0]; //在第1組數(shù)據(jù)中嵌入回送握手數(shù)據(jù)0xFFfor(j=0;j33;j++){TXREG=send_data[j]; //發(fā)送第1組32字節(jié)的A/D轉(zhuǎn)換數(shù)據(jù),包含握手信號0xFF為33個字節(jié)數(shù)據(jù)while(!TXIF); //查詢發(fā)送標志位,等待數(shù)據(jù)發(fā)送完畢再進行下一次數(shù)據(jù)發(fā)送}delay_ms(5); //PIC單片機定時5ms發(fā)送第2組A/D轉(zhuǎn)換數(shù)據(jù)send1_data[0]=rec_data[0]; //在第2組數(shù)據(jù)中嵌入回送握手數(shù)據(jù)0xFFfor(j=0;j33;j++){TXREG=send1_data[j];//發(fā)送第2組32個字節(jié)A/D轉(zhuǎn)換數(shù)據(jù)及握手信號數(shù)據(jù)While(!TXIF); //查詢發(fā)送標志位,等待數(shù)據(jù)發(fā)送完畢再進行下一次數(shù)據(jù)發(fā)送}}}
3 Matlab環(huán)境下PC機與單片機的通信
在Matlab6.0中新增的設(shè)備控制工具條(instrument control toolbox)用來負責上、下位機之間的通信。該設(shè)備控制工具箱的特色如下:
?、僦С只诖薪涌冢≧S-232、RS-422、RS-485)、GPIB總線(IEEE2488、HPIB標準)、VISA總線的通信;
?、谕ㄐ艛?shù)據(jù)支持二進制和文本(ASCII)兩種方式,文本方式支持SCPI(Standard Commands for Programmable Instruments)語言;
③支持異步通信和同步通信;
?、苤С只谑录?qū)動的通信。
從以上的Matlab設(shè)備控制工具箱的特點可以看到,Matlab完全可以滿足我們實現(xiàn)串行通信的要求。
3.1 Matlab對串行口控制的基礎(chǔ)知識
Matlab對串行口的編程控制主要分為四個步驟。
?、賱?chuàng)建串口設(shè)備對象并設(shè)置其屬性。
scom=serial('com1');%創(chuàng)建串口1的設(shè)備對象scom
scom.Terminator='CR';%設(shè)置終止符為CR(回車符),缺省為LF(換行符)
scom.InputBufferSize=1024;%輸入緩沖區(qū)為256B,缺省值為512B
scom.OutputBufferSize=1024;%輸出緩沖區(qū)為256B,缺省值為512B
scom.Timeout=0.5;%Y設(shè)置一次讀或?qū)懖僮鞯淖畲笸瓿蓵r間為0.5s,缺省值為10s
s.ReadAsyncMode='continuous'(缺省方式);%在異步通信模式方式下,讀取串口數(shù)據(jù)采用連續(xù)接收數(shù)據(jù)(continuous)的缺省方式,那么下位機返回的數(shù)據(jù)會自動地存入輸入緩沖區(qū)中.
注意:在些屬性只有在對象沒有被打開時才能改變其值,如InputBufferSize、OutputBufferSize屬性等。對于一個RS-232/RS-422/RS-485串口設(shè)備對象,其屬性的缺省值為波特率9 600b/s,異步方式,通信數(shù)據(jù)格式為8位數(shù)據(jù)位,無奇偶校驗位,1位停止位。如果要設(shè)置的串口設(shè)置對象的屬性值與缺省值的屬性值相同,用戶可以不用另行設(shè)置。
另外,設(shè)置串口設(shè)置對象的屬性也可以用一條指令完成,如:scom=serial('COM1','BaudRate',38400,'Parity','none','DataBits',8,'StopBits',1)。也可以用set命令,如set(scom,'BaudRate',19200,'Parity','even')。創(chuàng)建了對象后可以在Matlab命令窗口直接敲對象名并回車,看到其基本屬性和當前狀態(tài)。若需要知道其全部的屬性,可以用get(scom)命令。
②打開串口設(shè)備對象。
fopen(scom);
③讀寫串口操作。初始化并打開串口調(diào)協(xié)對象之后,現(xiàn)在可以對串口設(shè)備對象進行讀寫操作,串口的讀寫操作支持二進制和文本(ASCII)兩種方式。當Matlab通信數(shù)據(jù)采用西方(ASCII)方式時,讀寫串口設(shè)備的命令分別是fscanf、fpritf;當Matlab通信數(shù)據(jù)采用二進制方式時,讀寫串口設(shè)備的命令分別是fread、fwrite。下面以文本方式讀寫串口為例:
a.讀串口。A=fscanf(scom,'%d',[10,100];%從串口設(shè)備對象scom中讀入10*100個數(shù)據(jù)填充到數(shù)組A[10,100]中,并以整型的數(shù)據(jù)格式存放。
單片機相關(guān)文章:單片機教程
單片機相關(guān)文章:單片機視頻教程
單片機相關(guān)文章:單片機工作原理
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評論