|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
沒人理俺,只好舔著臉舊貼重提拉, |
| 作者:happystar 欄目:單片機(jī) |
大家好啊。我用52與PC串口通信,用串口精靈調(diào)試。在程序里單步模擬執(zhí)行,程序可以運(yùn)行到程序發(fā)送數(shù)據(jù)那塊,但是硬件連接的時(shí)候PC則顯示52沒有發(fā)數(shù)據(jù),本來程序可以走到那的啊。我想請教各位。(硬件連線肯定沒問題,我用令一個(gè)程序已經(jīng)試過了),老板催的緊,這個(gè)程序調(diào)通連1/5都沒完成,小弟現(xiàn)在實(shí)在調(diào)不出來了,在此謝謝大家拉。 void initUart(void){ T2CON = 0x30;//T2 用于波特率 9600 RCAP2H = 0xff; RCAP2L = 0xdc; TR2 = 1; PCON = 0; ES = 1; } void initInt(void){//初始化中斷 IP=0x10;//串口高優(yōu)先級中斷 IE=0x9a;//中斷總允許,串口,T0,T1中斷允許 TCON=0x05;//IT1,IT0置位 TMOD=0x51;//T0采用定時(shí)器方式1;T1采用記數(shù)方式1 PCON=0x00; SCON = 0xd0;//串口工作方式3,9位UART,波特率可變 TH0 = TIMER_HIGHT;//T0產(chǎn)生1ms的延時(shí)初值 TL0 = TIMER_LOW; TR0 = 1; TH1 = 0;//T1記數(shù) TL1 = 0; TR1 = 0; initUart(); } void initProg(void){ initInt(); b232Send = 0;//232設(shè)置為接受方式 } uint crc16(uint *puchMsg, uint usDataLen){ uchar uchCRCHi=0xFF; /* 高CRC字節(jié)初始化 */ uchar uchCRCLo=0xFF; /* 低CRC 字節(jié)初始化 */ uint uIndex; /* CRC循環(huán)中的索引 */ while(usDataLen--){ /* 傳輸消息緩沖區(qū) */ uIndex=uchCRCHi^*puchMsg++; /* 計(jì)算CRC */ uchCRCHi=uchCRCLo^auchCRCHi[uIndex]; uchCRCLo=auchCRCLo[uIndex]; } crc_highByte=uchCRCHi; crc_lowByte=uchCRCLo; return(crc_highByte<<8|crc_lowByte); } void beginSend(void){//開始發(fā)送數(shù)據(jù) sendNumber=send_dataBuf[4]; b232Send=1; //設(shè)為發(fā)送 sendPosi=0; if(sendNumber>1)sendNumber--;//發(fā)一個(gè)數(shù)據(jù),所以發(fā)送字節(jié)數(shù)減1 ACC=send_dataBuf[0]; TB8=P;//偶校驗(yàn) SBUF=ACC; } void checkComm0Modbus(void){//檢查uart0數(shù)據(jù) if((recv_dataBuf[0]==head_s)&&(recv_dataBuf[1]==head_p)&& (recv_dataBuf[2]==dev_addr)){//接受完,同步頭設(shè)備地址符合且偶校驗(yàn)正確 SWITCH(recv_dataBuf[3]){//判斷功能碼 case 0x01: dev_up_handle1(); break; case 0x03:// dev_up_handle2(); break; case 0x05:// dev_up_handle3(); break; default : break; } } } void dev_up_handle1(){ uchar byteCount; recv_crcData = crc16(recv_dataBuf,5); // if(recv_crcData ==((recv_dataBuf[5]<<8)|recv_dataBuf[6])){//校驗(yàn)正確,先高位再低位校驗(yàn) SWITCH(recv_dataBuf[4]){//判斷數(shù)據(jù)地址 case 0x01:{//發(fā)全部測量數(shù)據(jù) send_dataBuf[0]=head_s; send_dataBuf[1]=head_p; send_dataBuf[2]=dev_addr; send_dataBuf[3]=recv_dataBuf[3]; send_dataBuf[4]=53;//發(fā)送字節(jié)數(shù) byteCount=send_dataBuf[4]; send_crcData=crc16(send_dataBuf,byteCount); send_dataBuf[byteCount]=send_crcData>>8; byteCount++; send_dataBuf[byteCount]=send_crcData&0x0f; beginSend(); break; } case 0x02://發(fā)部分?jǐn)?shù)據(jù)` break; default: break; // } } } void timeProc(void){//定時(shí)處理 b1ms=0; b10ms=0; ET0=0;//T0關(guān)中斷 dwTickCount=dwIntTick; ET0=1;//開中斷 if(reach_1ms){//到達(dá)1ms reach_1ms =0; b1ms=1; if(recvTimeOut>0){//判斷超時(shí)時(shí)間 recvTimeOut--; if(recvTimeOut==0&&recvNumber>0){//通訊接收超時(shí) b232Send=0; //將232置為接收狀態(tài) recvNumber=0; //將接收到的數(shù)清零 checkoutError=0; } } } if(reach_10ms){ //到達(dá)10ms reach_10ms=0; b10ms=1; } } void main(void){sendNumber=0x10; recv_d |
| 2樓: | >>參與討論 |
| 作者: 1dqmoon 于 2006/9/28 22:53:00 發(fā)布:
re 你改一下程序,讓這個(gè)程序發(fā)一批數(shù)據(jù),在keil的debug下觀察serial口,看有沒有數(shù)據(jù), 單步執(zhí)行不可靠,也許是邏輯上的錯(cuò)誤 ps:能不能把你的頭定義也帖出來?方便別人幫你調(diào)試 |
|
| 3樓: | >>參與討論 |
| 作者: happystar 于 2006/9/28 22:58:00 發(fā)布:
頭文件 #include <reg52.h> typedef unsigned CHAR uCHAR; typedef unsigned CHAR uint; const uCHAR code auchCRCHi[] = { /* CRC 高位字節(jié)值表 */ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; const uCHAR code auchCRCLo[] = { /* CRC低位字節(jié)值表*/ 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 } ; #define dev_addr 0x01//設(shè)備地址 #define head_s 0x53//同步頭 #define head_p 0x50 #define TIMER_HIGHT 0xfc//T0采用方式1,延時(shí)1ms #define TIMER_LOW 0x65 uCHAR bdata flag_data; sbit b232Send=flag_data^0;//1表示232發(fā)送,0表示接受(***定義為運(yùn)行燈***) sbit reach_1ms=flag_data^1;//T0到達(dá)1ms標(biāo)志 sbit reach_10ms=flag_data^2;//T0到達(dá)10ms標(biāo)志 sbit b1ms=flag_data^3; sbit b10ms=flag_data^4; uCHAR idata send_dataBuf[55]; uCHAR idata recv_dataBuf[8]; uCHAR sendNumber,recvNumber; uCHAR idata checkoutError;// ==2 偶校驗(yàn)錯(cuò) uCHAR idata recvTimeOut; uCHAR idata sendPosi;//發(fā)送位置 uint recv_crcData,send_crcData; uCHAR crc_highByte; uCHAR crc_lowByte; uint dwTickCount,dwIntTick; //時(shí)鐘 uCHAR idata c10ms; //10ms 計(jì)時(shí) void dev_up_handle1(); |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |