音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
串口緩沖池的遍歷,懇請(qǐng)幫忙改正!(有源碼)
現(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
個(gè)人見解
最好是使用循環(huán)隊(duì)列 他的使用效率是最高的
在線形隊(duì)列的基礎(chǔ)上加上 頭 尾 緩沖長(zhǎng)度的變量即可 訪問時(shí)注意地址跨界是的操作即可。

3樓: >>參與討論
zhang_lj
這是我在用的一個(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
ding two...
 
5樓: >>參與討論
羅布泊
真搞不明白,都是庫(kù)函數(shù)惹的禍
找信息頭的時(shí)候用函數(shù)memcmp()來比對(duì)就要掉信息,非得一個(gè)個(gè)字符地比較,基本上解決

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
串行中斷程序
各位DX,能否貼幾個(gè)IO口模擬串口的c語言程序啊
請(qǐng)教大蝦:怎么利用51的待機(jī)工作方式
求助: 現(xiàn)在市場(chǎng)上GPS模塊行情
想自己做一套單片機(jī)試驗(yàn)板,不知如何入手,請(qǐng)各位指點(diǎn),謝謝!
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)