案例5-串口通信與其應(yīng)用_第1頁
案例5-串口通信與其應(yīng)用_第2頁
案例5-串口通信與其應(yīng)用_第3頁
案例5-串口通信與其應(yīng)用_第4頁
案例5-串口通信與其應(yīng)用_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

案例5_串口通信與其應(yīng)用第一頁,共67頁。案例5-串口通信及其應(yīng)用遠(yuǎn)程監(jiān)控(監(jiān)測(cè)與控制)系統(tǒng)上位機(jī)實(shí)現(xiàn):編輯、查詢、統(tǒng)計(jì)、報(bào)表打印等管理功能;下位機(jī)實(shí)現(xiàn):監(jiān)測(cè):信號(hào)與數(shù)據(jù)采集等控制等第二頁,共67頁。通信應(yīng)用案例-多點(diǎn)溫度采集第三頁,共67頁。通信應(yīng)用案例-多點(diǎn)溫度采集第四頁,共67頁。案例5-串口通信及其應(yīng)用通信有線:RS232、RS485、RS422、CAN、USB、以太網(wǎng)實(shí)驗(yàn)室調(diào)試:RS232工業(yè)上采用差分方式傳輸(RS485、CAN、以太網(wǎng))無線:低速紅外,高速紅外(IrDA)、藍(lán)牙(Bluetooth)、ZigBee、無線局域網(wǎng)(WLAN)、蜂窩網(wǎng)絡(luò)(GSM、CDMA、TD-SCDMA、WCDMA、CDMA2000第五頁,共67頁。RS232MAX232:5VMAX3232I:3.3V第六頁,共67頁。RS422/RS485MAX485:5VMAX3485:3.3V第七頁,共67頁。CANA82C250、TJA1050、TJA1040:5VSN65HVD230:3.3V第八頁,共67頁。USB第九頁,共67頁。以太網(wǎng)第十頁,共67頁。差分傳輸(RS485/422、CAN、以太網(wǎng))第十一頁,共67頁。無線數(shù)據(jù)傳輸無線模塊433M無線收發(fā)模塊CC1101傳輸距離:開闊地200m以上2.4GnRF24L01P無線模塊收發(fā)模塊傳輸距離:1000m以上串口轉(zhuǎn)zigbee無線模塊CC2530傳輸距離:1.6km

MG323GPRS/GSM模塊IrDA第十二頁,共67頁。無線紅外-IrDA第十三頁,共67頁。案例5-串口通信及其應(yīng)用串行通信標(biāo)準(zhǔn)RS232(RS232電平,通信距離<10m)RS422/RS485(差分傳輸,傳輸距離<5km,自定義通信機(jī)制)CAN(差分傳輸,傳輸距離<5km,完善的通信機(jī)制)通信方式點(diǎn)對(duì)點(diǎn)點(diǎn)對(duì)多通信可靠性通信協(xié)議多字節(jié)定長(zhǎng)不定長(zhǎng)校驗(yàn)方式和校驗(yàn)CRC校驗(yàn)第十四頁,共67頁。RS232通信接口臺(tái)式機(jī):含RS232串口(COM1:9Pin)筆記本:基本沒有RS232,可通過USB轉(zhuǎn)串口線實(shí)現(xiàn)DB9公頭DB9母頭第十五頁,共67頁。RS232串口引腳第十六頁,共67頁。RS232串口引腳功能腳位(Pin)簡(jiǎn)寫功能1CD載波偵測(cè)(CarrierDetect)2RXD接收字符(Receive)3TXD傳送字符(Transmit)4DTR數(shù)據(jù)端備妥(DataTerminalReady)5GND地線(Ground)6DSR數(shù)據(jù)備妥(DataSetReady)7RTS要求傳送(RequestToSend)8CTS清除以傳送(C1earToSend)9RI響鈴偵測(cè)(RingIndicator)三線制:交叉線第十七頁,共67頁。PC機(jī)串口地址標(biāo)準(zhǔn)串口地址串口號(hào)串口地址中斷號(hào)COM13F82COM22F81COM33E84COM42E83第十八頁,共67頁。8051串口AT89S51/52有一個(gè)可編程的全雙工串口。可實(shí)現(xiàn)數(shù)據(jù)的異步收發(fā):TXD端發(fā)送數(shù)據(jù)RXD端接收數(shù)據(jù)雙工:即能發(fā)送又能接收全雙工:即能發(fā)送又能接收,且收發(fā)可同時(shí)進(jìn)行半雙工:即能發(fā)送又能接收,但收發(fā)不能同時(shí)進(jìn)行單工:只能發(fā)或只能收RS232、RS422是全雙工RS485、CAN是半雙工第十九頁,共67頁。串口通信格式-異步TTL、CMOS電平異步通信格式(通過一根信號(hào)線實(shí)現(xiàn)數(shù)據(jù)傳輸)串口線無數(shù)據(jù)時(shí),保持高電平(1)STARTBIT:起始位(0),發(fā)送基準(zhǔn)信號(hào)DATAWORD:發(fā)送數(shù)據(jù)位(8位),低位先發(fā)PARITYBIT:奇偶校驗(yàn)位(1位)STOPBIT:停止位(1~2位高電平)如圖發(fā)送數(shù)據(jù)為:11001011B即0xCB波特率(bps:bitpersecond):每位發(fā)送的時(shí)間相等:這與通信波特率有關(guān)第二十頁,共67頁。提高傳輸距離措施-RS232電平傳輸TTL、CMOS電平傳輸距離<1m,超出1m容易受干擾??商岣邆鬏旊妷夯虿罘址绞教岣呖垢蓴_能力,有效提高傳輸距離。RS232電平:提高傳輸電壓,在波特率為9600bps時(shí),有效傳輸距離為10m左右。Ch1:CMOS電平Ch2:RS232電平RS232電平定義0電平:+3V~+15V1電平:-3V~-15VCMOS電平定義0電平:0V1電平:5V問題:如圖所發(fā)數(shù)據(jù)?00110101B0x35波特率約為多少?第二十一頁,共67頁。RS232邏輯電平的定義0電平:+3V~+15V1電平:-3V~-15V

第二十二頁,共67頁。TTL、CMOS-RS232電平轉(zhuǎn)換第二十三頁,共67頁。TTL、CMOS-RS232電平轉(zhuǎn)換電路RS232_RXDRS232_TXDTTL_CMOS_RXDTTL_CMOS_TXD第二十四頁,共67頁。提高傳輸距離措施-差分傳輸將TTL、CMOS電平轉(zhuǎn)成雙路差分信號(hào),通過雙絞線傳輸,有效抑制共模干擾信號(hào)(提高傳輸距離)采用專用芯片實(shí)現(xiàn)電平轉(zhuǎn)換。RS422、RS485、CAN都是采用該方式傳輸;在波特率為9600bps時(shí),有效傳輸距離為5km第二十五頁,共67頁。RS485/RS422接口電路MAX485驅(qū)動(dòng)芯片引腳DI:接收RO:發(fā)送RE#:接收使能DE:發(fā)送使能A:差分同相B:差分反相RE#、DE接在一起后接3V3:表示固定發(fā)送RE#、DE接RS485_C,可控發(fā)送接收RS485_C=0:接收RS485_C=1:發(fā)送第二十六頁,共67頁。CAN接口電路SJA1000T:CAN接口芯片,實(shí)現(xiàn)并行數(shù)據(jù)與CAN串行數(shù)據(jù)的互轉(zhuǎn);A82C250:CAN電平轉(zhuǎn)換芯片,實(shí)現(xiàn)TTL電平與差分電平互換A82C250、TJA1050、TJA1040:5VSN65HVD230:3.3V若處理器內(nèi)含CAN接口功能,則可省略SJA1000T第二十七頁,共67頁。差分保護(hù)電路由于差分傳輸距離長(zhǎng),容易受雷電的影響,造成電平轉(zhuǎn)換芯片、甚至CPU損壞,因此現(xiàn)場(chǎng)應(yīng)用時(shí)要有一定的硬件保護(hù)措施電壓保護(hù):TVS瞬態(tài)保護(hù)二極管SMBJ65CA(6.5V)電流保護(hù):自恢復(fù)保險(xiǎn)絲匹配電阻:在差分的最后一個(gè)終端信號(hào)間加一120歐姆的電阻,以解決串?dāng)_。第二十八頁,共67頁。RS485差分保護(hù)電路-光隔離第二十九頁,共67頁。RS485差分保護(hù)電路-光隔離第三十頁,共67頁。差分保護(hù)電路-光隔離B0505S-1W:DC-DC模塊DC-DC電源電路信號(hào)與電源全隔離第三十一頁,共67頁。同步通信同步(synchronous):多一路同步時(shí)鐘信號(hào),傳輸速率高異步(asynchronous)第三十二頁,共67頁。8051串口對(duì)應(yīng)有兩個(gè)緩沖器SBUF。(共用一個(gè)地址)串口數(shù)據(jù)接收b=SBUF; //取串口數(shù)據(jù)串口數(shù)據(jù)發(fā)送SBUF=a; //開始發(fā)送第三十三頁,共67頁。8051串口發(fā)送SBUF=a;//串口發(fā)送開始,發(fā)送完成需要一段時(shí)間以9600bps為例,1位數(shù)據(jù)的發(fā)送時(shí)間為1/9600秒=0.104ms,若按上圖的11位格式發(fā)送完成一字節(jié)需11.5ms左右,因此發(fā)送后必須等待11.5ms以上才能執(zhí)行下一次發(fā)送,否則會(huì)丟失數(shù)據(jù);等待發(fā)送完成方法:可采用delay(N);方式延時(shí),但此種方式對(duì)于N的確定較困難,且不同的波特率,N的值又不一樣;為此8051單片機(jī)引入了TI(發(fā)送完成標(biāo)志),當(dāng)發(fā)送完成后硬件自動(dòng)使TI=1,這樣只要等到TI標(biāo)志即可認(rèn)為發(fā)送完成。第三十四頁,共67頁。8051串口發(fā)送與接收-查詢方式串口發(fā)送SBUF=0x35;while(TI==0);//等待發(fā)送完成TI=0;//清發(fā)送標(biāo)志SBUF=0x35;while(TI==0);//等待發(fā)送完成TI=0; //清發(fā)送標(biāo)志TI:transferinterrupt發(fā)送結(jié)束標(biāo)志串口接收while(RI==0);//等待接收完成RI=0; //清接收標(biāo)志b=SBUF; //接收數(shù)據(jù)RI:receiveinterrupt接收結(jié)束標(biāo)志第三十五頁,共67頁。8051串口發(fā)送與接收-中斷方式

8051串口發(fā)送與接收也可采用中斷方式當(dāng)串口接收完成或發(fā)送完成后,硬件自動(dòng)產(chǎn)生中斷標(biāo)志(RI=1或TI=1)此時(shí)若中斷允許(ES=1且EA=1),程序會(huì)立即停止當(dāng)前主程序,自動(dòng)跳轉(zhuǎn)到中斷號(hào)為n=4的中斷入口地址(8n+3=0x0023)處執(zhí)行中斷服務(wù)程序,因?yàn)檫M(jìn)入該中斷有兩種可能(TI=1或RI=1),因此不能自動(dòng)對(duì)中斷標(biāo)志清零(需判斷是TI=1還是RI=1引起的中斷);此時(shí)若中斷不允許(ES=0或EA=0),則不執(zhí)行中斷服務(wù)程序。第三十六頁,共67頁。8051串口發(fā)送與接收-中斷方式第三十七頁,共67頁。8051串口編程-查詢方式【例1】如圖所示上位機(jī)發(fā)送數(shù)據(jù)a,下位機(jī)接收后回a+1//串口初始化函數(shù)voidSbuf_Init(void){}voidmain(void){ unsignedchara; Sbuf_Init(); //串口初始化

while(1) { //串口數(shù)據(jù)接收

while(RI==0); //等待接收完成

RI=0; //清接收標(biāo)志

a=SBUF; //接收數(shù)據(jù) //串口數(shù)據(jù)發(fā)送

SBUF=a+1; //串口發(fā)送

while(TI==0); //等待發(fā)送完成

TI=0; //清發(fā)送標(biāo)志 //KbScan(); //LedDisplay(); }}查詢方式存在問題:下位機(jī)不知上位機(jī)何時(shí)發(fā)串口數(shù)據(jù),若上位機(jī)一直不發(fā),則之后的鍵盤掃描、數(shù)碼顯示程序無法執(zhí)行。因此下位機(jī)應(yīng)采用中斷方式接收。第三十八頁,共67頁。8051串口編程-中斷方式【例1】如圖所示上位機(jī)發(fā)送數(shù)據(jù)a,下位機(jī)接收后回a+1//中斷服務(wù)程序voidUART_ISR(void)interrupt4{ unsignedchara; if(RI)//接收產(chǎn)生的中斷 {

RI=0; //清接收標(biāo)志

a=SBUF; //接收數(shù)據(jù) //串口數(shù)據(jù)發(fā)送

SBUF=a+1; //串口發(fā)送

while(TI==0); //等待發(fā)送完成

TI=0; //清發(fā)送標(biāo)志 }}voidmain(void){

Sbuf_Init(); //串口初始化

while(1) { //KbScan(); //LedDisplay(); }}第三十九頁,共67頁。8051串口編程-中斷方式【例1】如圖所示上位機(jī)發(fā)送數(shù)據(jù)a,下位機(jī)接收后回a+1在串口中斷內(nèi)采用查詢方式發(fā)送,按9600bps算,需等待1ms左右才能發(fā)送完成,占用中斷時(shí)間較長(zhǎng),可將串口發(fā)送部分移到主程序執(zhí)行。//中斷服務(wù)程序 unsignedcharRxd_Data;//串口接收數(shù)據(jù)unsignedcharRxd_Over;//串口接收完成標(biāo)志voidUART_ISR(void)interrupt4{ if(RI)//接收產(chǎn)生的中斷 {

RI=0;//清接收標(biāo)志

Rxd_Data=SBUF;//接收數(shù)據(jù)

Rxd_Over=1; //置Rxd_Over標(biāo)志 }}voidmain(void){ Sbuf_Init(); //串口初始化

while(1) { if(Rxd_Over)//若接收完成 { //串口數(shù)據(jù)發(fā)送

SBUF=a+1; //串口發(fā)送

while(TI==0);//等待發(fā)送完成

TI=0;//清發(fā)送標(biāo)志

Rxd_Over=0;//清Rxd_Over標(biāo)志 } //KbScan(); //LedDisplay(); }}第四十頁,共67頁。8051串口編程-初始化串口初始化串口工作方式SCON波特率設(shè)置TMODTH1、TL1ES、EATR1//串口初始化函數(shù)voidSbuf_Init(void){SCON=; //串口工作方式 //波特率設(shè)置

TMOD=; //T1工作方式

TH1=0xfd; //T1計(jì)數(shù)初值

TL1=0xfd; ES=1;EA=1; //串口中斷使能

TR1=1; //啟動(dòng)定時(shí)器}第四十一頁,共67頁。8051串口編程-初始化SM0、SM1:方式設(shè)置位方式0:移位寄存器輸入/輸出方式。數(shù)據(jù)通過RXD輸入/出,TXD輸出同步脈沖CP。該方式下,收發(fā)數(shù)據(jù)為8位,低位在前。波特率固定為fosc/12方式1、方式3:波特率可設(shè)置,所不同是10位或11位(1位起始位+8位或9位數(shù)據(jù)位+1位停止位)方式2、方式3:都是11位格式,但方式2波特率固定,方式3波特率可變。波特率分析見下SM0SM1方式說明波特率(bps)000同步移位寄存器fosc/1201110位異步收發(fā)Baud=2^SMOD×(T1溢出率/32)10211位異步收發(fā)Baud=2^SMOD×fosc/6411311位異步收發(fā)Baud=2^SMOD×(T1溢出率/32)第四十二頁,共67頁。8051串口編程-初始化SM2:多機(jī)方式控制位SM2=0:點(diǎn)對(duì)點(diǎn)SM2=1:點(diǎn)對(duì)多REN(ReceiveEnable):串行接收允許控制位TB8(TransmitBit8):在方式2、3中,將被發(fā)送數(shù)據(jù)的第9位(奇偶校驗(yàn)位等);RB8(ReceiveBit8):接收數(shù)據(jù)第9位在方式0中,該位不起作用;在方式1中該位為接收數(shù)據(jù)的停止位;在方式2、3中為接收數(shù)據(jù)的第9位;TI、RI發(fā)送/接收結(jié)束標(biāo)志位,中斷內(nèi)需手工清零。第四十三頁,共67頁。8051串口編程-初始化SCON定義示例【例1】定義8051串口為10位波特率可設(shè)置的點(diǎn)對(duì)點(diǎn)方式SCON=0x50;//0101**00B【例2】定義8051串口為11位波特率可設(shè)置的點(diǎn)對(duì)點(diǎn)方式SCON=0xd0;//1101**00BSM0SM1方式說明波特率(bps)000同步移位寄存器fosc/1201110位異步收發(fā)Baud=2^SMOD×(T1溢出率/32)10211位異步收發(fā)Baud=2^SMOD×fosc/6411311位異步收發(fā)Baud=2^SMOD×(T1溢出率/32)第四十四頁,共67頁。8051串口編程-初始化波特率設(shè)置典型波特率1200bps、2400bps、4800bps、9600bps、19200bps、57600bps、115200bps常用波特率9600bps、19200bps、115200bps【例1】波特率位9600bps、115200bps,傳輸一位所需時(shí)間?傳輸一字節(jié)(10位)需時(shí)間?9600bps:0.104ms/位,1字節(jié)約1.04ms115200bps:8.68us/位,1字節(jié)約86.8us【例2】若有1張1.44M字節(jié)的軟盤,采用9600bps按10位方式進(jìn)行傳輸,傳輸完成共需多少時(shí)間?t1=1.44*1024*1024*10/9600秒=1570秒=26分鐘若采用115200bpst2=1.44*1024*1024*10/115200秒=130秒第四十五頁,共67頁。8051串口編程-初始化特特率設(shè)置8051單片機(jī)串口方式1、3為波特率可設(shè)置,計(jì)算公式為Baud=2^SMOD×(T1溢出率/32)//T1溢出率=1/T1定時(shí)時(shí)間SM0SM1方式說明波特率(bps)000同步移位寄存器fosc/1201110位異步收發(fā)Baud=2^SMOD×(T1溢出率/32)10211位異步收發(fā)Baud=2^SMOD×fosc/6411311位異步收發(fā)Baud=2^SMOD×(T1溢出率/32)第四十六頁,共67頁。8051串口編程-初始化特特率設(shè)置8051單片機(jī)串口方式1、3為波特率可設(shè)置,計(jì)算公式為n:定時(shí)器1計(jì)數(shù)次數(shù)以fosc=11.0592MHz為例,要實(shí)現(xiàn)9600bps的波特率,n=?n=fosc/384/9600=11059200/384/9600=3(整數(shù))因此fosc=11.0592Mhz晶振的存在是合理的。第四十七頁,共67頁。8051串口編程-初始化//串口初始化函數(shù)voidSbuf_Init(void){SCON=0x50;//10位方式 //波特率設(shè)置

TMOD=(TMOD&0x0f)|0x20;//T1方式2

TH1=0xfd; //T1計(jì)數(shù)初值

TL1=0xfd; ES=1;EA=1; //串口中斷使能

TR1=1; //啟動(dòng)定時(shí)器}注意:T1方式2具有將TH1的8位計(jì)數(shù)初值自動(dòng)載入到TL1中功能;該自動(dòng)載入是在溢出時(shí)由硬件自動(dòng)完成的;T1必須要啟動(dòng)T1中斷無需允許,這樣溢出時(shí)就不進(jìn)入Timer1_ISR()第四十八頁,共67頁。8051串口編程-初始化特特率設(shè)置8051單片機(jī)串口方式1、3為波特率可設(shè)置,計(jì)算公式為以fosc=11.0592MHz為例,能否實(shí)現(xiàn)19200bps的波特率?n=fosc/384/19200=11059200/384/19200=1.5(小數(shù))//不能因此8051單片機(jī)提供了PCON(電源控制寄存器),其SMOD為波特率倍增控制位。注意:PCON不能位尋址。第四十九頁,共67頁。8051串口編程-串口初始化//fosc=11.0592MHz,9600bps//串口初始化函數(shù)9600bpsvoidSbuf_Init(void){SCON=0x50;//10位方式 //波特率設(shè)置

PCON=0x00;//波特率不倍增

TMOD=(TMOD&0x0f)|0x20;//T1方式2

TH1=0xfd; //T1計(jì)數(shù)初值

TL1=0xfd; ES=1;EA=1; //串口中斷使能

TR1=1; //啟動(dòng)定時(shí)器}//fosc=11.0592MHz,19200bps//串口初始化函數(shù)19200bpsvoidSbuf_Init(void){SCON=0x50;//10位方式 //波特率設(shè)置

PCON=0x80;//波特率倍增

TMOD=(TMOD&0x0f)|0x20;//T1方式2

TH1=0xfd; //T1計(jì)數(shù)初值

TL1=0xfd; ES=1;EA=1; //串口中斷使能

TR1=1; //啟動(dòng)定時(shí)器}第五十頁,共67頁。8051串口編程-波特率計(jì)算//【問題】若8051單片機(jī)fosc=11.0592MHz,則其能實(shí)現(xiàn)的波特率有哪些?采用C語言編程實(shí)現(xiàn)。#include"stdio.h"voidmain(void){ floatbaud; floatfosc=11059200; inti; for(i=0;i<=255;i++) { baud=fosc/384/(256-i); if(baud==(int)baud) { printf("計(jì)數(shù)初值:TL1=%-5dSOMD=0:Baud=%6d\t",i,(int)baud); printf("SOMD=1:Baud=%6d\n",2*(int)baud); } }}第五十一頁,共67頁。串口通信協(xié)議工程應(yīng)用中一般采用多字節(jié)通信定長(zhǎng)(8字節(jié))不定長(zhǎng)(chr$(13)+chr$(10)作為結(jié)束標(biāo)志)第五十二頁,共67頁。串口通信協(xié)議增加字節(jié)頭與尾及必要的數(shù)據(jù)校驗(yàn)以提高可靠性,其中常用的數(shù)據(jù)校驗(yàn)方式有和校驗(yàn)與CRC校驗(yàn)方式。其中CRC包括CRC8、CRC16等,其可靠性比和校驗(yàn)好。第五十三頁,共67頁。CRC16校驗(yàn)CRC校驗(yàn)實(shí)現(xiàn)方法查表法(浪費(fèi)空間)即時(shí)計(jì)算法(浪費(fèi)時(shí)間)#include"stdio.h"constunsignedintcrcvalue[]={0x0000,0xC1C0,0x81C1,0x4001,0x01C3,0xC003,0x8002,0x41C2,0x01C6,0xC006,0x8007,0x41C7,0x0005,0xC1C5,0x81C4,0x4004,0x01CC,0xC00C,0x800D,0x41CD,0x000F,0xC1CF,0x81CE,0x400E,0x000A,0xC1CA,0x81CB,0x400B,0x01C9,0xC009,0x8008,0x41C8,0x01D8,0xC018,0x8019,0x41D9,0x001B,0xC1DB,0x81DA,0x401A,0x001E,0xC1DE,0x81DF,0x401F,0x01DD,0xC01D,0x801C,0x41DC,0x0014,0xC1D4,0x81D5,0x4015,0x01D7,0xC017,0x8016,0x41D6,0x01D2,0xC012,0x8013,0x41D3,0x0011,0xC1D1,0x81D0,0x4010,0x01F0,0xC030,0x8031,0x41F1,0x0033,0xC1F3,0x81F2,0x4032,0x0036,0xC1F6,0x81F7,0x4037,0x01F5,0xC035,0x8034,0x41F4,0x003C,0xC1FC,0x81FD,0x403D,0x01FF,0xC03F,0x803E,0x41FE,0x01FA,0xC03A,0x803B,0x41FB,0x0039,0xC1F9,0x81F8,0x4038,0x0028,0xC1E8,0x81E9,0x4029,0x01EB,0xC02B,0x802A,0x41EA,0x01EE,0xC02E,0x802F,0x41EF,0x002D,0xC1ED,0x81EC,0x402C,0x01E4,0xC024,0x8025,0x41E5,0x0027,0xC1E7,0x81E6,0x4026,0x0022,0xC1E2,0x81E3,0x4023,0x01E1,0xC021,0x8020,0x41E0,0x01A0,0xC060,0x8061,0x41A1,0x0063,0xC1A3,0x81A2,0x4062,0x0066,0xC1A6,0x81A7,0x4067,0x01A5,0xC065,0x8064,0x41A4,0x006C,0xC1AC,0x81AD,0x406D,0x01AF,0xC06F,0x806E,0x41AE,0x01AA,0xC06A,0x806B,0x41AB,0x0069,0xC1A9,0x81A8,0x4068,0x0078,0xC1B8,0x81B9,0x4079,0x01BB,0xC07B,0x807A,0x41BA,0x01BE,0xC07E,0x807F,0x41BF,0x007D,0xC1BD,0x81BC,0x407C,0x01B4,0xC074,0x8075,0x41B5,0x0077,0xC1B7,0x81B6,0x4076,0x0072,0xC1B2,0x81B3,0x4073,0x01B1,0xC071,0x8070,0x41B0,0x0050,0xC190,0x8191,0x4051,0x0193,0xC053,0x8052,0x4192,0x0196,0xC056,0x8057,0x4197,0x0055,0xC195,0x8194,0x4054,0x019C,0xC05C,0x805D,0x419D,0x005F,0xC19F,0x819E,0x405E,0x005A,0xC19A,0x819B,0x405B,0x0199,0xC059,0x8058,0x4198,0x0188,0xC048,0x8049,0x4189,0x004B,0xC18B,0x818A,0x404A,0x004E,0xC18E,0x818F,0x404F,0x018D,0xC04D,0x804C,0x418C,0x0044,0xC184,0x8185,0x4045,0x0187,0xC047,0x8046,0x4186,0x0182,0xC042,0x8043,0x4183,0x0041,0xC181,0x8180,0x4040};//CRC16_S:查表法unsignedshortintCRC16_S(unsignedchar*buf,unsignedcharlength){ unsignedcharuchCRCHi=0xFF;//highbyteofCRCinitialized unsignedcharuchCRCLo=0xFF;//lowbyteofCRCinitialized unsigneduIndex; //indexintoCRClookuptable while(length--) //passthroughmessagebuffer { uIndex=uchCRCLo^*(buf++); //alculatetheCRC uchCRCLo=uchCRCHi^(crcvalue[uIndex]>>8); uchCRCHi=crcvalue[uIndex]&0xff; } return(uchCRCHi<<8|uchCRCLo);}voidmain(void){ unsignedcharRxd_buf[8]={0x01,0x03,0x02,0x00,0x00,0x00,0x00,0x00}; unsignedshortintcrc_value; crc_value=CRC16_S(Rxd_buf,6);//對(duì)Rxd_buf的前6字節(jié)求CRC16 printf("%x\t%x\n",crc_value/256,crc_value%256);}查表法第五十四頁,共67頁。CRC16校驗(yàn)CRC校驗(yàn)實(shí)現(xiàn)方法查表法(浪費(fèi)空間)即時(shí)計(jì)算法(浪費(fèi)時(shí)間)#include"stdio.h"http://CRC16:即時(shí)計(jì)算法unsignedintCRC16_C(unsignedchar*buf,unsignedcharlength){ unsignedintcrc_result=0xffff; unsignedchari; while(length--) { crc_result^=*(buf++); for(i=0;i<8;i++) { if(crc_result&0x01) crc_result=(crc_result>>1)^0xa001; else crc_result=crc_result>>1; } } return(crc_result);}voidmain(void){ unsignedcharRxd_buf[8]={0x01,0x03,0x02,0x00,0x00,0x00,0x00,0x00}; unsignedshortintcrc_value; crc_value=CRC16_C(Rxd_buf,6);//對(duì)Rxd_buf的前6字節(jié)求CRC16 printf("%x\t%x\n",crc_value/256,crc_value%256);}即時(shí)計(jì)算法第五十五頁,共67頁。類ModBus通信協(xié)議-定長(zhǎng)8字節(jié)CRC16通信#defineMODBUS_ADDR0x01#defineMODBUS_RD0x03#defineMODBUS_WDATA10x02unsignedcharRxD_buf[8];unsignedcharRX_OVER;voidUART_ISR(void)interrupt4 { staticunsignedcharcount=0; staticunsignedcharpre_data=0; staticunsignedcharmid_data=0; staticunsignedcharnow_data=0; ////////////////////////////////////////////// if(RI) { now_data=SBUF; if(pre_data==MODBUS_ADDR&&mid_data==MODBUS_RD&&now_data==MODBUS_WDATA1) { RxD_buf[0]=pre_data; RxD_buf[1]=mid_data; RxD_buf[2]=now_data; count=3; } else { RxD_buf[count]=now_data; count++; if(count==8) { count=0; RX_OVER=1; } } pre_data=mid_data; mid_data=now_data; RI=0; } }第五十六頁,共67頁。類ModBus通信協(xié)議-定長(zhǎng)8字節(jié)CRC16通信voidmain(void){ unsignedshortintcrc_value; Sbuf_Init(); //串口初始化

while(1) { if(RX_OVER) { crc_value=CRC16_C(RxD_buf,6); if(RxD_buf[6]=crc_value%256&&RxD_buf[7]==crc_value/256) { //CRC16校驗(yàn)成功 }

RX_OVER=0; } }}第五十七頁,共67頁。通信調(diào)試方法-通信故障排查1、串口線連接問題沒連接計(jì)算機(jī)串口線壞用一根導(dǎo)線將DB9的Pin2與Pin3短接,采用Scomm32串口調(diào)試工具發(fā)送數(shù)據(jù),看是否有接收2、單片機(jī)硬件問題用示波器連接單片的TXD引腳,程序發(fā)送數(shù)據(jù),看是否有CMOS、RS232波形,從而判斷是否為硬件故障。3、軟件問題第五十八頁,共67頁。串口通信方式串口通信方式點(diǎn)對(duì)點(diǎn)PC機(jī)與MCU(PC與智能儀表間的通信)MCU與MCU點(diǎn)對(duì)多:多機(jī)通信第五十九頁,共67頁。串口通信模式-單字節(jié)發(fā)送單字節(jié)通信,上位機(jī)主動(dòng)上位機(jī)程序串口通信工具:scomm32自己編程:控件實(shí)現(xiàn)(VB)API函數(shù)實(shí)現(xiàn)(VC)下位機(jī)程序接收:中斷方式發(fā)送:查詢方式第六十頁,共67頁。PC機(jī)串口通信實(shí)現(xiàn)兩種方式實(shí)現(xiàn)控件MSCOMM32.OCX應(yīng)用程序接口函數(shù):API(OpenFile()……)第六十一頁,共67頁。PC機(jī)串口通信(MSCOMM32.OCX)首先為工程添加MSCOMM32.ocx等控件添加如下代碼:包括串口初始化,發(fā)送、接收等操作PrivateSubForm_Load()IfMSComm1.PortOpenThenMSComm1.PortOpen=False'關(guān)閉串口

MSComm1.CommPort=1'設(shè)置串口1MSComm1.Settings="9600,N,8,1"'設(shè)置串口波特率

MSComm1.InputMode=comInputModeBinary'設(shè)置串口通信模式--二進(jìn)制模式

MSComm1.InputLen=1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論