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

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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

一個關(guān)于串口的問題,請周工解釋一下

作者:zxwwwwcom 欄目:ARM技術(shù)
一個關(guān)于串口的問題,請周工解釋一下

最近用EasyARM2200調(diào)試串口通信發(fā)現(xiàn)一個問題:用的是 Thumb Executable Image for UCOSII(for lpc22xx) 這個模板
        void  TaskUart1Revice(void *pdata)
{
    uint8 a;
     while(1)
    {
     pdata = pdata;
     a=UART1Getch();
     UART1Putch(a);
//  UART1Write(&a, 1);
    }
}
發(fā)送: 0X55 一百個
接收:
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 11 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
就有隨機(jī)錯誤數(shù)據(jù)在中間,請解釋。。。。。
但是用:
        void  TaskUart1Revice(void *pdata)
{
    uint8 a;
     while(1)
    {
     pdata = pdata;
     a=UART1Getch();
//   UART1Putch(a);
    UART1Write(&a, 1);
    }
}
就是對的。。。。。。。。。。。。。。。。。

2樓: >>參與討論
zlgarm
我們的例子是使用uart0,您用uart0試一下。
另外,通訊線路難免出錯,只有每次都這樣才可能是程序錯誤。

3樓: >>參與討論
zxwwwwcom
我試了,你可以試試,UART0、 UART1是一樣的
怎么用這段程序:
        void  TaskUart1Revice(void *pdata)
{
    uint8 a;
     while(1)
    {
     pdata = pdata;
     a=UART1Getch();
//   UART1Putch(a);
    UART1Write(&a, 1);
    }
}
就是對的!。。。。。。。。。。。。。。。!

而且把UART1Putch();函數(shù)中的 OS_ENTER_CRITICAL();提前改成:

    OS_ENTER_CRITICAL();
    QueueWrite((void *)UART0SendBuf, Data);         /* 數(shù)據(jù)入隊(duì) */
//    OS_ENTER_CRITICAL();

就對了


4樓: >>參與討論
zxwwwwcom
可能是程序問題。!
就是每次都有平均200個字節(jié)要出個錯,但我找了好久都沒找到。

你可以試試在這里加一句 if: 就可以抓到錯誤。

void UART0Putch(uint8 Data)
{
    uint8 TEMP;
    
    QueueWrite((void *)UART0SendBuf, Data);         /* 數(shù)據(jù)入隊(duì) */
    OS_ENTER_CRITICAL();
    if ((U0LSR & 0x00000020) != 0)
    {                                      /* UART0發(fā)送保持寄存器空 */
        QueueRead(&TEMP, UART0SendBuf);    /* 發(fā)送最初入隊(duì)的數(shù)據(jù) */
        
        if(TEMP!=0x55)      /*測試代碼,就可以抓到了,用調(diào)試器發(fā)0x55*/
        {
             TEMP=0;      /*在這里設(shè)斷點(diǎn),連續(xù)發(fā)100-200個0X55*/
         }
  
        U0THR = TEMP;
        U0IER = U0IER | 0x02;             /* 允許發(fā)送中斷 */
    }
    OS_EXIT_CRITICAL();
}
請幫幫忙 !。。!謝謝


5樓: >>參與討論
zlgarm
我用串口調(diào)試助手2.1測試沒有問題。
您看一下這個函數(shù)是否一致:
        uint8 UART0Getch(void)
{
    uint8 err;

    OS_ENTER_CRITICAL();
    while ((U0LSR & 0x00000001) == 0)
    {                                           /* 沒有收到數(shù)據(jù) */
        U0IER = U0IER | 0x01;                   /* 允許接收中斷 */
        OSSemPend(Uart0Sem, 0, &err);           /* 等待接收數(shù)據(jù) */
    }
    err = U0RBR;                                /* 讀取收到的數(shù)據(jù) */
    OS_EXIT_CRITICAL();
    return err;
}

另外,請使用最新的移植代碼。

* - 本貼最后修改時間:2005-4-4 16:46:58 修改者:zlgarm

6樓: >>參與討論
zxwwwwcom
請問網(wǎng)上有最新的移植代碼嗎???
我用的是你們的光盤上的。

是一致的。



7樓: >>參與討論
zxwwwwcom
是否是一次發(fā)送100個?????
象這樣:5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555

一次性發(fā)送????

8樓: >>參與討論
zxwwwwcom
兩個移植代碼我都用了,還是有同樣的問題???
高效的移植代碼問題要嚴(yán)重些,怎么改都有錯

標(biāo)準(zhǔn)的移植代碼還是存在同樣的問題,我是在RAM中調(diào)試的,是否有問題??



9樓: >>參與討論
汽車電子
我直接用中斷,收發(fā)每個字節(jié)都中斷,很好
   接收完畢就來個 os_evt_set(UART0_RECEIVE_OK_EVT_FLAG,tidUART0_RecOK);   //


   發(fā)送只調(diào)用uchar    PutBuffer(uchar  InitSum,uint L,uchar *p)
   在PutBuffer中只發(fā)送一個字節(jié),其它的在中斷中發(fā)送

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函數(shù)名: PutBuffer
    功能: 從串口0發(fā)送一塊數(shù)據(jù)(16進(jìn)制)
    入口: 初始檢驗(yàn)和,數(shù)據(jù)長度,待發(fā)送的數(shù)據(jù)指針
    出口: 發(fā)送成功與否標(biāo)志,成功為0,不成功為非0
*/
uchar         PutBuffer(uchar  InitSum,uint L,uchar *p)
{
    uint   i;
    if(Txd.Sending)
       return 1;         // 發(fā)送失敗,需要等待
   Txd.Length = L;
    TxdP = p;
    Txd.CheckSum = InitSum;
    for(i=0;i<Txd.Length;i++)
    {
       Txd.CheckSum ^= *p;
       p++;
    }
    *p = Txd.CheckSum;        // Add ChechSum at the end of the buffer
    Txd.Length += 1;           
    Txd.Counter = 0;
    U0THR = *TxdP;
    return 0;
}  // End of <PutBuffer> Function



////////////////////////////////////////////////// 發(fā)送中斷部分程序
NOP();    NOP();
              if(Txd.Length==0)
              {
                  Txd.Sending = 0;
                  //os_evt_set(UART0_TRANSMIT_OK_EVT_FLAG,tidUART0_TxdOK);   //
                  break;
              }
               if(Txd.Length)       
            {
                //RS485_TRANSMIT_ENABLE;
                    Txd.Length--;
                Txd.Counter++;
                  TxdP++;
                U0THR = *TxdP;           
                 Txd.Sending = 1;
             }
             else
             {
                Txd.Sending = 0;
                 //RS485_RECEIVE_ENABLE
              }  


10樓: >>參與討論
zxwwwwcom
謝謝  汽車電子 。。!
用中斷直接收/發(fā)是沒什么問題。!

我只是想搞清楚那段代碼那里出錯了,就是找不到,所以郁悶。!



11樓: >>參與討論
zxwwwwcom
請幫幫忙,解決一下。。!急。!
 
12樓: >>參與討論
zxwwwwcom
??????????????????????????????
 
13樓: >>參與討論
americ
把停止位設(shè)置成兩個!
晶振頻率~!


連續(xù)通訊,這幾個人中,本人較有經(jīng)驗(yàn).......絕不是吹牛!





14樓: >>參與討論
zxwwwwcom
沒有用,我試了的
只要不停的發(fā)送就會出錯,哎。。。。。。。。。。。

15樓: >>參與討論
zxwwwwcom
怎么不說話了?????回答呀。。。。。。。。。!
 
16樓: >>參與討論
ARM白菜
很多問題有的時候是不明白的
何必那么執(zhí)著,只要有正確方便的路走就可以了,我們是應(yīng)用不是研究

17樓: >>參與討論
zxwwwwcom
呵呵,說的是,反正有正確的方法
 
18樓: >>參與討論
navy0007
uart0 能發(fā)送字節(jié)00H嗎?

我用書上的例子UART0做通訊,發(fā)現(xiàn)字節(jié)0H不能發(fā)送,其他任何字節(jié)都正常,請問各位是什么原因?

19樓: >>參與討論
mzy202
我也發(fā)現(xiàn)uart0不能發(fā)送0x00,急死我了!
我也發(fā)現(xiàn)uart00x00不能發(fā)送,急死我了!

我們買了22002100的開發(fā)板(2214、2132),兩個板都存在這個問題。就是0x00不能發(fā)送出來,原先我以為是上位機(jī)軟件的不能接收到0x00,但是后來發(fā)現(xiàn)根本原因在ARM7上。

另外,有一個很難解釋的問題,就是只修改波特率后就可以發(fā)送0x00了,但是如果又修改發(fā)送數(shù)據(jù)的程序段,該問題又出現(xiàn)了!  超級失落。

海軍0007也發(fā)現(xiàn)了相同的問題,希望能引起各位同仁的注意,并給我們提出修正的方案,謝謝!



參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
是不是地址移位?
請教:在ads環(huán)境下,外部內(nèi)部ram問題
處學(xué)者
ADS中運(yùn)行C實(shí)驗(yàn)(3.8節(jié))沒有通過!
請教zlgARM
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


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