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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

案例5_串口通信與其應用第一頁,共67頁。案例5-串口通信及其應用遠程監(jiān)控(監(jiān)測與控制)系統(tǒng)上位機實現(xiàn):編輯、查詢、統(tǒng)計、報表打印等管理功能;下位機實現(xiàn):監(jiān)測:信號與數(shù)據(jù)采集等控制等第二頁,共67頁。通信應用案例-多點溫度采集第三頁,共67頁。通信應用案例-多點溫度采集第四頁,共67頁。案例5-串口通信及其應用通信有線:RS232、RS485、RS422、CAN、USB、以太網實驗室調試:RS232工業(yè)上采用差分方式傳輸(RS485、CAN、以太網)無線:低速紅外,高速紅外(IrDA)、藍牙(Bluetooth)、ZigBee、無線局域網(WLAN)、蜂窩網絡(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頁。以太網第十頁,共67頁。差分傳輸(RS485/422、CAN、以太網)第十一頁,共67頁。無線數(shù)據(jù)傳輸無線模塊433M無線收發(fā)模塊CC1101傳輸距離:開闊地200m以上2.4GnRF24L01P無線模塊收發(fā)模塊傳輸距離:1000m以上串口轉zigbee無線模塊CC2530傳輸距離:1.6km

MG323GPRS/GSM模塊IrDA第十二頁,共67頁。無線紅外-IrDA第十三頁,共67頁。案例5-串口通信及其應用串行通信標準RS232(RS232電平,通信距離<10m)RS422/RS485(差分傳輸,傳輸距離<5km,自定義通信機制)CAN(差分傳輸,傳輸距離<5km,完善的通信機制)通信方式點對點點對多通信可靠性通信協(xié)議多字節(jié)定長不定長校驗方式和校驗CRC校驗第十四頁,共67頁。RS232通信接口臺式機:含RS232串口(COM1:9Pin)筆記本:基本沒有RS232,可通過USB轉串口線實現(xiàn)DB9公頭DB9母頭第十五頁,共67頁。RS232串口引腳第十六頁,共67頁。RS232串口引腳功能腳位(Pin)簡寫功能1CD載波偵測(CarrierDetect)2RXD接收字符(Receive)3TXD傳送字符(Transmit)4DTR數(shù)據(jù)端備妥(DataTerminalReady)5GND地線(Ground)6DSR數(shù)據(jù)備妥(DataSetReady)7RTS要求傳送(RequestToSend)8CTS清除以傳送(C1earToSend)9RI響鈴偵測(RingIndicator)三線制:交叉線第十七頁,共67頁。PC機串口地址標準串口地址串口號串口地址中斷號COM13F82COM22F81COM33E84COM42E83第十八頁,共67頁。8051串口AT89S51/52有一個可編程的全雙工串口。可實現(xiàn)數(shù)據(jù)的異步收發(fā):TXD端發(fā)送數(shù)據(jù)RXD端接收數(shù)據(jù)雙工:即能發(fā)送又能接收全雙工:即能發(fā)送又能接收,且收發(fā)可同時進行半雙工:即能發(fā)送又能接收,但收發(fā)不能同時進行單工:只能發(fā)或只能收RS232、RS422是全雙工RS485、CAN是半雙工第十九頁,共67頁。串口通信格式-異步TTL、CMOS電平異步通信格式(通過一根信號線實現(xiàn)數(shù)據(jù)傳輸)串口線無數(shù)據(jù)時,保持高電平(1)STARTBIT:起始位(0),發(fā)送基準信號DATAWORD:發(fā)送數(shù)據(jù)位(8位),低位先發(fā)PARITYBIT:奇偶校驗位(1位)STOPBIT:停止位(1~2位高電平)如圖發(fā)送數(shù)據(jù)為:11001011B即0xCB波特率(bps:bitpersecond):每位發(fā)送的時間相等:這與通信波特率有關第二十頁,共67頁。提高傳輸距離措施-RS232電平傳輸TTL、CMOS電平傳輸距離<1m,超出1m容易受干擾??商岣邆鬏旊妷夯虿罘址绞教岣呖垢蓴_能力,有效提高傳輸距離。RS232電平:提高傳輸電壓,在波特率為9600bps時,有效傳輸距離為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電平轉換第二十三頁,共67頁。TTL、CMOS-RS232電平轉換電路RS232_RXDRS232_TXDTTL_CMOS_RXDTTL_CMOS_TXD第二十四頁,共67頁。提高傳輸距離措施-差分傳輸將TTL、CMOS電平轉成雙路差分信號,通過雙絞線傳輸,有效抑制共模干擾信號(提高傳輸距離)采用專用芯片實現(xiàn)電平轉換。RS422、RS485、CAN都是采用該方式傳輸;在波特率為9600bps時,有效傳輸距離為5km第二十五頁,共67頁。RS485/RS422接口電路MAX485驅動芯片引腳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接口芯片,實現(xiàn)并行數(shù)據(jù)與CAN串行數(shù)據(jù)的互轉;A82C250:CAN電平轉換芯片,實現(xiàn)TTL電平與差分電平互換A82C250、TJA1050、TJA1040:5VSN65HVD230:3.3V若處理器內含CAN接口功能,則可省略SJA1000T第二十七頁,共67頁。差分保護電路由于差分傳輸距離長,容易受雷電的影響,造成電平轉換芯片、甚至CPU損壞,因此現(xiàn)場應用時要有一定的硬件保護措施電壓保護:TVS瞬態(tài)保護二極管SMBJ65CA(6.5V)電流保護:自恢復保險絲匹配電阻:在差分的最后一個終端信號間加一120歐姆的電阻,以解決串擾。第二十八頁,共67頁。RS485差分保護電路-光隔離第二十九頁,共67頁。RS485差分保護電路-光隔離第三十頁,共67頁。差分保護電路-光隔離B0505S-1W:DC-DC模塊DC-DC電源電路信號與電源全隔離第三十一頁,共67頁。同步通信同步(synchronous):多一路同步時鐘信號,傳輸速率高異步(asynchronous)第三十二頁,共67頁。8051串口對應有兩個緩沖器SBUF。(共用一個地址)串口數(shù)據(jù)接收b=SBUF; //取串口數(shù)據(jù)串口數(shù)據(jù)發(fā)送SBUF=a; //開始發(fā)送第三十三頁,共67頁。8051串口發(fā)送SBUF=a;//串口發(fā)送開始,發(fā)送完成需要一段時間以9600bps為例,1位數(shù)據(jù)的發(fā)送時間為1/9600秒=0.104ms,若按上圖的11位格式發(fā)送完成一字節(jié)需11.5ms左右,因此發(fā)送后必須等待11.5ms以上才能執(zhí)行下一次發(fā)送,否則會丟失數(shù)據(jù);等待發(fā)送完成方法:可采用delay(N);方式延時,但此種方式對于N的確定較困難,且不同的波特率,N的值又不一樣;為此8051單片機引入了TI(發(fā)送完成標志),當發(fā)送完成后硬件自動使TI=1,這樣只要等到TI標志即可認為發(fā)送完成。第三十四頁,共67頁。8051串口發(fā)送與接收-查詢方式串口發(fā)送SBUF=0x35;while(TI==0);//等待發(fā)送完成TI=0;//清發(fā)送標志SBUF=0x35;while(TI==0);//等待發(fā)送完成TI=0; //清發(fā)送標志TI:transferinterrupt發(fā)送結束標志串口接收while(RI==0);//等待接收完成RI=0; //清接收標志b=SBUF; //接收數(shù)據(jù)RI:receiveinterrupt接收結束標志第三十五頁,共67頁。8051串口發(fā)送與接收-中斷方式

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

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

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

RI=0; //清接收標志

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

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

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

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

RI=0; //清接收標志

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

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

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

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

Sbuf_Init(); //串口初始化

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

RI=0;//清接收標志

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

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

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

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

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

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

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

TMOD=; //T1工作方式

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

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

TR1=1; //啟動定時器}第四十一頁,共67頁。8051串口編程-初始化SM0、SM1:方式設置位方式0:移位寄存器輸入/輸出方式。數(shù)據(jù)通過RXD輸入/出,TXD輸出同步脈沖CP。該方式下,收發(fā)數(shù)據(jù)為8位,低位在前。波特率固定為fosc/12方式1、方式3:波特率可設置,所不同是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:多機方式控制位SM2=0:點對點SM2=1:點對多REN(ReceiveEnable):串行接收允許控制位TB8(TransmitBit8):在方式2、3中,將被發(fā)送數(shù)據(jù)的第9位(奇偶校驗位等);RB8(ReceiveBit8):接收數(shù)據(jù)第9位在方式0中,該位不起作用;在方式1中該位為接收數(shù)據(jù)的停止位;在方式2、3中為接收數(shù)據(jù)的第9位;TI、RI發(fā)送/接收結束標志位,中斷內需手工清零。第四十三頁,共67頁。8051串口編程-初始化SCON定義示例【例1】定義8051串口為10位波特率可設置的點對點方式SCON=0x50;//0101**00B【例2】定義8051串口為11位波特率可設置的點對點方式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串口編程-初始化波特率設置典型波特率1200bps、2400bps、4800bps、9600bps、19200bps、57600bps、115200bps常用波特率9600bps、19200bps、115200bps【例1】波特率位9600bps、115200bps,傳輸一位所需時間?傳輸一字節(jié)(10位)需時間?9600bps:0.104ms/位,1字節(jié)約1.04ms115200bps:8.68us/位,1字節(jié)約86.8us【例2】若有1張1.44M字節(jié)的軟盤,采用9600bps按10位方式進行傳輸,傳輸完成共需多少時間?t1=1.44*1024*1024*10/9600秒=1570秒=26分鐘若采用115200bpst2=1.44*1024*1024*10/115200秒=130秒第四十五頁,共67頁。8051串口編程-初始化特特率設置8051單片機串口方式1、3為波特率可設置,計算公式為Baud=2^SMOD×(T1溢出率/32)//T1溢出率=1/T1定時時間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串口編程-初始化特特率設置8051單片機串口方式1、3為波特率可設置,計算公式為n:定時器1計數(shù)次數(shù)以fosc=11.0592MHz為例,要實現(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位方式 //波特率設置

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

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

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

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

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

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

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

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

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

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

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

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

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

TR1=1; //啟動定時器}第五十頁,共67頁。8051串口編程-波特率計算//【問題】若8051單片機fosc=11.0592MHz,則其能實現(xiàn)的波特率有哪些?采用C語言編程實現(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("計數(shù)初值:TL1=%-5dSOMD=0:Baud=%6d\t",i,(int)baud); printf("SOMD=1:Baud=%6d\n",2*(int)baud); } }}第五十一頁,共67頁。串口通信協(xié)議工程應用中一般采用多字節(jié)通信定長(8字節(jié))不定長(chr$(13)+chr$(10)作為結束標志)第五十二頁,共67頁。串口通信協(xié)議增加字節(jié)頭與尾及必要的數(shù)據(jù)校驗以提高可靠性,其中常用的數(shù)據(jù)校驗方式有和校驗與CRC校驗方式。其中CRC包括CRC8、CRC16等,其可靠性比和校驗好。第五十三頁,共67頁。CRC16校驗CRC校驗實現(xiàn)方法查表法(浪費空間)即時計算法(浪費時間)#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);//對Rxd_buf的前6字節(jié)求CRC16 printf("%x\t%x\n",crc_value/256,crc_value%256);}查表法第五十四頁,共67頁。CRC16校驗CRC校驗實現(xiàn)方法查表法(浪費空間)即時計算法(浪費時間)#include"stdio.h"http://CRC16:即時計算法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);//對Rxd_buf的前6字節(jié)求CRC16 printf("%x\t%x\n",crc_value/256,crc_value%256);}即時計算法第五十五頁,共67頁。類ModBus通信協(xié)議-定長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é)議-定長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校驗成功 }

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

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

MSComm1.InputMode=comInputModeBinary'設置串口通信模式--二進制模式

MSComm1.InputLen=1

溫馨提示

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

最新文檔

評論

0/150

提交評論