|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
MODBUS通訊規(guī)約 如何改 103通訊規(guī)約 |
| 作者:gygabc 欄目:通信技術(shù) |
MODBUS通訊規(guī)約 如何改 103通訊規(guī)約 那位大蝦幫我把MODBUS通訊規(guī)約 如何改 103通訊規(guī)約 謝謝 /* MODBUS通訊規(guī)約中CRC校驗碼地計算 */ #include "AT89X51.H" #include "INTRINS.H" #define uCHAR unsigned CHAR uCHAR in_command=0; uCHAR sbuf_count=0; CHAR getsbuf[8];/*接受字符緩沖區(qū)*/ CHAR return_xy[17]={0x01,0x01,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; void XyToCrc(CHAR mm,CHAR *pint); void Init_SerialComm(void); void Init_CpuIO(void); void DelayX1ms(uCHAR count); void outCHAR(CHAR i); void get_digital(void); void main(void) { CHAR m=17;/*返回數(shù)據(jù)字節(jié)數(shù)*/ CHAR *pint1; CHAR CHARx,CHARy; Init_SerialComm(); /*初始化串口*/ Init_CpuIO(); /*初始化IO口*/ for(;;) { get_digital(); /*采集數(shù)字量*/ pint1=return_xy; XyToCrc(m-2,pint1); /*計算返回數(shù)據(jù)的校驗碼*/ CHARx=return_xy[0]; CHARy=return_xy[1]; CHARx=return_xy[2]; CHARy=return_xy[3]; CHARx=return_xy[4]; CHARy=return_xy[5]; CHARx=return_xy[6]; CHARy=return_xy[7]; CHARx=return_xy[8]; CHARy=return_xy[9]; CHARx=return_xy[10]; CHARy=return_xy[11]; CHARx=return_xy[12]; CHARy=return_xy[13]; CHARy=return_xy[14]; CHARx=return_xy[15]; CHARy=return_xy[16]; if(in_command==1) { outCHAR(m); /*數(shù)據(jù)返回*/ } } } void Init_SerialComm(void) /*初始化串口*/ { SCON=0x50; /*SCON: serail mode 1, 8-bit UART, enable receive*/ TMOD=0x20; /*TMOD: timer 1, mode 2, 8-bit reload*/ TH1=0xfd; /*baud rate 9600b/s*/ /*TL1=0xfd;*/ PCON=0x00; /* SMOD=0*/ IE=0x90; /*IE.7=EA=1;IE.4=ES=1,IE.3=ET1=0, IE.2=EX1=0,IE.1=ET0=0,IE.0=EX0=0,Enable GLOBAL interrupt and serial interrupt*/ TR1=1; /*start timer 1*/ } void Init_CpuIO(void) /*初始化IO口*/ { P1=0xff;/*關(guān)閉采集口*/ P2=0xff;/*關(guān)閉采集口*/ /*p3_0=RXD,p3_1=TXD,p3_2=/INT0,p3_3=/INT1 P3口的第二定義在IE中設(shè)置起用*/ /*p3_4=T0,p3_5=T1,p3_6=/WR,p3_7=/RD */ } void DelayX1ms(uCHAR count) /*延時1ms*/ { uCHAR k; while(count!=0) {count--; for(k=0;k<72;k++) {} } } /*串口接收中斷處理函數(shù)*/ void Serial(void) interrupt 4 using 2 { CHAR *pint2; CHAR i,crcl=0,crch=0; while(RI==0); RI=0;/* sbuf_count getsbuf[3] */ getsbuf[sbuf_count++]=SBUF; SWITCH(sbuf_count) /*接收一個數(shù)據(jù)就判斷一次是否是發(fā)給自己的命令*/ { case 0x01: if(getsbuf[0]!=return_xy[0]) sbuf_count=0x00; break; case 0x02: if(getsbuf[1]!=0x01) sbuf_count=0x00; break; case 0x03: if(getsbuf[2]!=0x00) sbuf_count=0x00; break; case 0x04: if(getsbuf[3]!=0x00) sbuf_count=0x00; break; case 0x05: if(getsbuf[4]!=0x00) sbuf_count=0x00; break; case 0x06: if(getsbuf[5]!=0x60) sbuf_count=0x00; break; case 0x07: break; case 0x0 |
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |