|
|||||||||||
| 技術(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ù) |
最近用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 于 2005/4/4 10:51:00 發(fā)布:
我們的例子是使用uart0,您用uart0試一下。 另外,通訊線路難免出錯,只有每次都這樣才可能是程序錯誤。 |
|
| 3樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/4 16:04:00 發(fā)布:
我試了,你可以試試,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 于 2005/4/4 16:17:00 發(fā)布:
可能是程序問題。! 就是每次都有平均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 于 2005/4/4 16:39:00 發(fā)布:
我用串口調(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 于 2005/4/4 16:50:00 發(fā)布:
請問網(wǎng)上有最新的移植代碼嗎??? 我用的是你們的光盤上的。 是一致的。 |
|
| 7樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/4 16:53:00 發(fā)布:
是否是一次發(fā)送100個????? 象這樣:5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 一次性發(fā)送???? |
|
| 8樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/4 22:45:00 發(fā)布:
兩個移植代碼我都用了,還是有同樣的問題??? 高效的移植代碼問題要嚴(yán)重些,怎么改都有錯 標(biāo)準(zhǔn)的移植代碼還是存在同樣的問題,我是在RAM中調(diào)試的,是否有問題?? |
|
| 9樓: | >>參與討論 |
| 作者: 汽車電子 于 2005/4/4 23:44:00 發(fā)布:
我直接用中斷,收發(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 于 2005/4/5 8:46:00 發(fā)布:
謝謝 汽車電子 。。! 用中斷直接收/發(fā)是沒什么問題。! 我只是想搞清楚那段代碼那里出錯了,就是找不到,所以郁悶。! |
|
| 11樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/5 15:12:00 發(fā)布:
請幫幫忙,解決一下。。!急。! |
|
| 12樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/5 21:37:00 發(fā)布:
?????????????????????????????? |
|
| 13樓: | >>參與討論 |
| 作者: americ 于 2005/4/5 21:44:00 發(fā)布:
把停止位設(shè)置成兩個! 晶振頻率~! 連續(xù)通訊,這幾個人中,本人較有經(jīng)驗(yàn).......絕不是吹牛! |
|
| 14樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/6 8:39:00 發(fā)布:
沒有用,我試了的 只要不停的發(fā)送就會出錯,哎。。。。。。。。。。。 |
|
| 15樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/6 10:58:00 發(fā)布:
怎么不說話了?????回答呀。。。。。。。。。! |
|
| 16樓: | >>參與討論 |
| 作者: ARM白菜 于 2005/4/6 11:07:00 發(fā)布:
很多問題有的時候是不明白的 何必那么執(zhí)著,只要有正確方便的路走就可以了,我們是應(yīng)用不是研究 |
|
| 17樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2005/4/6 11:13:00 發(fā)布:
呵呵,說的是,反正有正確的方法 |
|
| 18樓: | >>參與討論 |
| 作者: navy0007 于 2005/10/8 16:43:00 發(fā)布:
uart0 能發(fā)送字節(jié)00H嗎? 我用書上的例子UART0做通訊,發(fā)現(xiàn)字節(jié)0H不能發(fā)送,其他任何字節(jié)都正常,請問各位是什么原因? |
|
| 19樓: | >>參與討論 |
| 作者: mzy202 于 2006/1/11 17:01:00 發(fā)布:
我也發(fā)現(xiàn)uart0不能發(fā)送0x00,急死我了! 我也發(fā)現(xiàn)uart00x00不能發(fā)送,急死我了! 我們買了2200 和2100的開發(fā)板(2214、2132),兩個板都存在這個問題。就是0x00不能發(fā)送出來,原先我以為是上位機(jī)軟件的不能接收到0x00,但是后來發(fā)現(xiàn)根本原因在ARM7上。 另外,有一個很難解釋的問題,就是只修改波特率后就可以發(fā)送0x00了,但是如果又修改發(fā)送數(shù)據(jù)的程序段,該問題又出現(xiàn)了! 超級失落。 海軍0007也發(fā)現(xiàn)了相同的問題,希望能引起各位同仁的注意,并給我們提出修正的方案,謝謝! |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |