|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | 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 |
串口緩沖池的遍歷,懇請(qǐng)幫忙改正!(有源碼) |
| 作者:羅布泊 欄目:單片機(jī) |
現(xiàn)在做一通信程序,從串口進(jìn)來數(shù)據(jù)以9600bps、500~800bytes/秒的速率進(jìn)入緩沖區(qū),然后主循環(huán)中以環(huán)形隊(duì)列格式進(jìn)行處理,從數(shù)據(jù)區(qū)中提取出所需的不同格式的消息。部分源碼如下: //------------------------------------------------------------------------------------- // 隊(duì)列管理標(biāo)志 //------------------------------------------------------------------------------------- bit Overflow(void) { return((r_in-r_out)>(MaxSize-1)?1:0); } bit Empty(void) { return((r_in-r_out)<0?1:0); } bit Full(void) { if (!Overflow() && !Empty()) return(1); else return(0); } main.c ... while(1) { if (Full()) { if (GpgsaHeader(&r_buf[r_out&0x7ff])) { a_count ++; iLengthTemp = Ender(&r_buf[r_out&0x7ff]); GpgsaSol(&r_buf[r_out&0x7ff]); r_out += iLengthTemp; } else if (GpgsvHeader(&r_buf[r_out&0x7ff])) { v_count ++; iLengthTemp = Ender(&r_buf[r_out&0x7ff]); GpgsvSol(&r_buf[r_out&0x7ff]); r_out += iLengthTemp; } else if ( BinMesHead(&r_buf[r_out&0x7ff])) { b_count ++; iLengthTemp=(r_buf[(r_out+9)&0x7ff] << 8 )+r_buf[(r_out+8)&0x7ff]; if (iLengthTemp>0 && iLengthTemp < 4096) { r_out +=iLengthTemp+32; } } r_out ++; } } 現(xiàn)在主要有幾個(gè)問題: 1.如何控制隊(duì)列的指針,不讓r_out > r_in(通過仿真發(fā)現(xiàn)確實(shí)有超出)? 2.如何等待r_in相對(duì)r_out足夠大,使得隊(duì)列中已經(jīng)正確存貯了一條或多條完整的消息? 3.能否幫忙分析一下以上程序的原理性錯(cuò)誤? 4.能否提供一些相關(guān)的例程做參考?如有,請(qǐng)發(fā)EMAIL:nantiangumo@163.com 先謝謝各位啦! |
| 2樓: | >>參與討論 |
| 作者: zgl7903 于 2005/3/30 9:43:00 發(fā)布:
個(gè)人見解 最好是使用循環(huán)隊(duì)列 他的使用效率是最高的 在線形隊(duì)列的基礎(chǔ)上加上 頭 尾 緩沖長(zhǎng)度的變量即可 訪問時(shí)注意地址跨界是的操作即可。 |
|
| 3樓: | >>參與討論 |
| 作者: zhang_lj 于 2005/3/30 12:22:00 發(fā)布:
這是我在用的一個(gè)環(huán)形緩沖區(qū) byte idata Uart_loop_buff[128]; byte data Uart_read_ptr = 0; byte data Uart_write_ptr = 0; byte data Uart_rcv_state = 0; void Uart_Int(void) interrupt 4 { if(RI) { RI = 0; TI = 0; Uart_loop_buff[Uart_write_ptr] = SBUF; Uart_write_ptr = (Uart_write_ptr++)&0x7F; } } void Uart_rcv_frame(void) { static byte step = 0; static byte rcv_count = 0; /*接收計(jì)數(shù)*/ word data i = 0; word data j = 0; word data crc_temp = 0; SWITCH(step) case 0: if(Uart_read_ptr==Uart_write_ptr) return; if(Uart_loop_buff[Uart_read_ptr]!=Msg_head) { Uart_read_ptr = (Uart_read_ptr++)&0x7F; return; } Uart_rcv_buff[Uart_rcv_length] = Uart_loop_buff[Uart_read_ptr]; Uart_read_ptr = (Uart_read_ptr++)&0x7F; Uart_rcv_length++; step++; rcv_count++; Set_Soft_Timer(0,6) break; case 1: while(Uart_read_ptr!=Uart_write_ptr) { Uart_rcv_buff[Uart_rcv_length] = Uart_loop_buff[Uart_read_ptr]; Uart_read_prt++; Uart_rcv_length++; rcv_count++; if(!Soft_timer[0]) break; } 。。。 我的建議緩沖區(qū)大小由你的數(shù)據(jù)流及單片機(jī)處理能力決定,最好大些,防止溢出 |
|
| 4樓: | >>參與討論 |
| 作者: liaozhihua 于 2005/3/30 12:31:00 發(fā)布:
ding two... |
|
| 5樓: | >>參與討論 |
| 作者: 羅布泊 于 2005/3/31 22:36:00 發(fā)布:
真搞不明白,都是庫(kù)函數(shù)惹的禍 找信息頭的時(shí)候用函數(shù)memcmp()來比對(duì)就要掉信息,非得一個(gè)個(gè)字符地比較,基本上解決 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |