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

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ī)
各位高手幫我看一看這個(gè)串行口問題。!是什么情況.
#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
還有!
控制的IO口狀態(tài),也不能達(dá)到控制的效果。!
命令格式:30 30 31 31
第一個(gè)是地址,二個(gè)是輸出,三個(gè)是P1.0輸出1。四個(gè)是校驗(yàn)和

3樓: >>參與討論
hotpower
有時(shí)間看看~~~
 
4樓: >>參與討論
win2000_li
先謝謝了。!我可能是還沒有把串行口的時(shí)序搞清楚。。!
自已還要努力。。

謝謝。!

希望能指點(diǎn)一下。!

5樓: >>參與討論
hotpower
估計(jì)是while(--i);搞得鬼.
將其屏蔽掉試試.//while(--i);

再:
while(--i);
先為何i沒初值???(首次i=10000,其他i=0xffff)

而且while(--i);可能要丟數(shù)據(jù),因?yàn)?1的串口沒有FIFO

6樓: >>參與討論
win2000_li
改了的,有所改善
但是還有問題啊!

如:
    我發(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
這就是十六進(jìn)制發(fā)送需要同步的問題
 
8樓: >>參與討論
win2000_li
那個(gè)這問題的解決呢。
請兄弟指點(diǎn)小弟一下你的思想。。。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
關(guān)于可能遭到痛毆的貼子---菜鳥發(fā)貼前必讀[轉(zhuǎn)]
再提匯編軟復(fù)位問題?
問個(gè)關(guān)于485加TVS的弱弱的問題!
《匠人手記》之三《一階濾波算法之深入研究》已經(jīng)發(fā)布
用運(yùn)放LMV324為什么聲音會(huì)失真???急????
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號