|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
各位高手幫我看一看這個(gè)串行口問題啊!是什么情況. |
| 作者:win2000_li 欄目:單片機(jī) |
#include<reg52.h> #include<string.h> #define TBUF_SIZE 4 #define RBUF_SIZE 4 unsigned CHAR tbuf[TBUF_SIZE];//發(fā)送緩沖區(qū) unsigned CHAR rbuf[RBUF_SIZE];//接收緩沖區(qū) unsigned CHAR r_head; unsigned CHAR t_head; //發(fā)送緩沖區(qū)的頭計(jì)數(shù)器 unsigned CHAR t_len; //要發(fā)送數(shù)據(jù)的長度 unsigned CHAR TEMP = 0; //臨時(shí)計(jì)數(shù)器 unsigned CHAR remp = 0; //臨時(shí)計(jì)數(shù)器 unsigned CHAR count; unsigned CHAR code Ret[4] = "00ok"; unsigned CHAR code Err[4] = "0err"; unsigned CHAR rxdata[6]; bit rflag; /*******串行口初化函數(shù)**************/ void com_initialize(void) { EA = 0; t_head = 0; //清除接收和發(fā)送緩沖區(qū) t_len = 0; PCON = 0x00; //SMOD = 0 SCON = 0xD0; //串行口方式3,11位異步收發(fā)。允許接收,清除發(fā)送中斷標(biāo)志,清除接收中斷村志 T2CON = 0x34; //0011,0100定時(shí)器2的溢出脈沖作串口發(fā)送時(shí)鐘,和接收時(shí)鐘.啟動(dòng)定時(shí)器2 #if 1 RCAP2H = 0x0ff; //22.1184MHZ 單倍速9600 RCAP2L = 0x0b8; #else RCAP2H = 0x0ff; //22.1184MHZ 雙倍速9600 RCAP2L = 0x071; #endif ES=1; //允許串行中斷/ TR2 = 1; //啟動(dòng)T2 EA = 1; } /*啟動(dòng)發(fā)送*/ void com_send_data(unsigned CHAR *senddata, unsigned CHAR len) { unsigned CHAR i; t_len = len; //發(fā)送的長度 for(i = 0; i < t_len; i++) { tbuf[i] = senddata[i]; } rflag = 0; memset(rbuf,0,4); TI = 1; //開始發(fā)送 } unsigned CHAR CHECKSUM(unsigned CHAR *puInBuf, unsigned CHAR puInBufLen) { unsigned CHAR i; unsigned CHAR ucRet = 0; for (i = 0; i <= puInBufLen-1; i++) { ucRet ^= puInBuf[i]; } return(ucRet); } /*******************中斷處理函數(shù)********************/ //串行口中斷(完成數(shù)據(jù)的接收和發(fā)送) void com_isr(void) interrupt 4 using 2 { if(RI) { RI = 0; rbuf[r_head++]=SBUF; if(r_head == 4) { rflag =1; r_head = 0; } /*ch=SBUF; if(ch > 127) { rbuf[count++] = ch; CHECKSUM = ch - 128; } else { rbuf[count++] = ch; CHECKSUM ^= ch; if((count == RBUF_SIZE)&&(!CHECKSUM)) { rflag = 1; count = 0; } } */ } else if(TI) { TI = 0; if(t_head >= t_len) { t_head = 0; } else { SBUF = tbuf[t_head++]; } } } void main(void) { unsigned int i=10000; unsigned CHAR j; com_initialize(); while(1) { if(rflag)//如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出 { j = !CHECKSUM(&rbuf, 4); SWITCH(j) { case 0: //P1 = rbuf[1]; com_send_data(&Err, 4); while(--i); break; &nbs |
| 2樓: | >>參與討論 |
| 作者: win2000_li 于 2007/1/22 10:43:00 發(fā)布:
還有! 控制的IO口狀態(tài),也不能達(dá)到控制的效果。! 命令格式:30 30 31 31 第一個(gè)是地址,二個(gè)是輸出,三個(gè)是P1.0輸出1。四個(gè)是校驗(yàn)和 |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/22 12:47:00 發(fā)布:
有時(shí)間看看~~~ |
|
| 4樓: | >>參與討論 |
| 作者: win2000_li 于 2007/1/22 13:35:00 發(fā)布:
先謝謝了。!我可能是還沒有把串行口的時(shí)序搞清楚。。! 自已還要努力。。 謝謝。! 希望能指點(diǎn)一下。! |
|
| 5樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/22 16:41:00 發(fā)布:
估計(jì)是while(--i);搞得鬼. 將其屏蔽掉試試.//while(--i); 再: while(--i); 先為何i沒初值???(首次i=10000,其他i=0xffff) 而且while(--i);可能要丟數(shù)據(jù),因?yàn)?1的串口沒有FIFO |
|
| 6樓: | >>參與討論 |
| 作者: win2000_li 于 2007/1/22 17:21:00 發(fā)布:
改了的,有所改善 但是還有問題啊! 如: 我發(fā): 00 00 01 01 ---HEX 有時(shí)收到: 01 00 00 01 ---HEX 應(yīng)該收到: 00 00 01 01 ---HEX 把設(shè)備重新上電復(fù)位后,問題就消除了。 不知為什么?是不是發(fā)送數(shù)據(jù)時(shí),第一次只收到前三個(gè),第二次才補(bǔ)上第一個(gè),但是導(dǎo)致出錯(cuò)。! 不好意思!因?yàn)榈谝淮胃愦,所以不懂,請大家指點(diǎn)。! |
|
| 7樓: | >>參與討論 |
| 作者: hotpower 于 2007/1/22 18:01:00 發(fā)布:
這就是十六進(jìn)制發(fā)送需要同步的問題 |
|
| 8樓: | >>參與討論 |
| 作者: win2000_li 于 2007/1/23 10:00:00 發(fā)布:
那個(gè)這問題的解決呢。 請兄弟指點(diǎn)小弟一下你的思想。。。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |