|
|||||||||||
| 技術(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 |
串口通信的問題 ! |
| 作者:lwsogood 欄目:單片機(jī) |
PIC18F8490,串口通信,收只有一次正常,其他只能收到FF.為什么? 晶振11.0592,波特率9600,高速異步8位傳輸。BRG=71;串口的配置也是按照DATASHEET的。。通過WATCH,只調(diào)試收數(shù)據(jù)時(shí),上位機(jī)發(fā)下來的數(shù)據(jù)發(fā)了多次后才能進(jìn)入一次接收中斷。簡單說,就是我開串口調(diào)試助手,不停的發(fā)數(shù)據(jù),下位機(jī)只接受到一次正確的數(shù)據(jù),然后就是FF.只調(diào)試單片機(jī)發(fā)送數(shù)據(jù)時(shí),程序死在中斷里。。。移位發(fā)送寄存器一直處于滿狀態(tài),大家知道,發(fā)送的中斷標(biāo)志是由硬件清的,結(jié)果就導(dǎo)致我發(fā)的數(shù)據(jù)雖然在TXREG緩沖區(qū)里有,但因?yàn)榧拇嫫饕恢睗M,所以就一直發(fā)不出去。。。 檢查硬件,那塊電平轉(zhuǎn)換芯片正負(fù)電壓都正常,發(fā)送狀態(tài)時(shí),上位機(jī)的輸入有波形,輸出到PIC的也有。但是發(fā)送就是沒有任何波形。 本人才疏學(xué)淺,實(shí)在搞不定,希望各位大俠施展一下身手,拔刀相助! |
| 2樓: | >>參與討論 |
| 作者: anzhongxin 于 2006/9/25 13:53:00 發(fā)布:
全部改用查詢做實(shí)試吧! |
|
| 3樓: | >>參與討論 |
| 作者: zgl7903 于 2006/9/25 14:13:00 發(fā)布:
個(gè)人見解 發(fā)的數(shù)據(jù)雖然在TXREG緩沖區(qū)里有,但因?yàn)榧拇嫫饕恢睗M,所以就一直發(fā)不出去 ——不是很明白LZ的意思,既然是由數(shù)據(jù)應(yīng)該是不停的發(fā),為什么是發(fā)不出去? 1 可能是硬件控制寄存器沒有設(shè)置好,詳細(xì)看看DATASHEET說明 2 波特率不對,循環(huán)發(fā)送0x55或0xAA 示波器測量脈寬是否正確? |
|
| 4樓: | >>參與討論 |
| 作者: lwsogood 于 2006/9/25 16:47:00 發(fā)布:
多謝大家,不過還是沒搞明白。。。。 回樓上的,是這樣的,PIC有兩級的存儲區(qū)。數(shù)據(jù)由軟件放到TXREG緩沖器中,然后當(dāng)收到停止符時(shí),硬件把緩沖器數(shù)據(jù)放到移位發(fā)送寄存器中。然后才是真正的發(fā)出去。 (只調(diào)試發(fā)送的過程)硬件控制寄存器的確沒設(shè)置好。改正后,我把發(fā)送和接收中斷關(guān)了。在主程序里發(fā)數(shù)據(jù)給上位機(jī)。 if(i==8) { i=0; } TXREG1 = buff[i]; i++; 上位機(jī)收到幾十次數(shù)據(jù)后,就沒了。我想應(yīng)該是時(shí)序問題。。。 請教一下該在哪里延時(shí)或者怎么處理?能夠讓它每次的數(shù)據(jù)都能發(fā)送到上位機(jī) |
|
| 5樓: | >>參與討論 |
| 作者: lwsogood 于 2006/9/26 8:39:00 發(fā)布:
程序如下,拜托看看啊。。 void Ini_Uart() { // SET UART I/O TRISC6 = 0; TRISC7 = 1; // SET TXSTA CSRC = 0; TX9 = 0; // 8位數(shù)據(jù)格式 TXEN = 0; // 發(fā)送允許no SYNC = 0; // 異步通信方式 BRGH = 0; // 高速波特率設(shè)置 TRMT = 0; TX9D = 0; // SET RCSTA SPEN = 1; // UART允許 RX9 = 0; // 接收第9位清0 SREN = 0; CREN = 0; // 接收允許 no FERR = 0; OERR = 0; RX9D = 0; // SET bautrate SPBRG = 17; // SET 9600bps // SET UART INTERRUPT TXIE = 0; // UART 發(fā)送中斷允許NO TXIF = 0; // UART 發(fā)送中斷標(biāo)志位清0 RCIE = 0; // UART 接收中斷允許NO RCIF = 0; // UART 接收中斷標(biāo)志位清0 } mian() { INTCON=0x00; initial(); Ini_Uart(); TXEN=1; while(1) { if(TRMT==1)//如果移位發(fā)送寄存器空 { if(i==8) { i=0; } TXREG1 = buff[i]; i++; } } void initial() { PIE1=0x00; PIE2=0x00; PIE3=0x00; } |
|
| 6樓: | >>參與討論 |
| 作者: lwsogood 于 2006/9/26 8:41:00 發(fā)布:
這個(gè)程序 在在線調(diào)試模式下,可以讓上位機(jī)收到24組數(shù)據(jù),接著就再也收不到了 直接燒進(jìn)去,上電后,收到兩個(gè)字節(jié),不是我的數(shù)據(jù)。關(guān)電后,收到一串?dāng)?shù)據(jù),也不是我的真實(shí)數(shù)據(jù)。 |
|
| 7樓: | >>參與討論 |
| 作者: zgl7903 于 2006/9/26 8:56:00 發(fā)布:
個(gè)人見解 關(guān)閉了串口中斷,發(fā)送數(shù)據(jù)是需要用TF標(biāo)志或者檢查緩位移寄存器標(biāo)志來判斷是否完成的, //檢查位移寄存器 void putch(unsigned CHAR byte) { while(!TRMT1)continue; TXREG1 = byte; } //檢查中斷標(biāo)志,在初始化時(shí)需要置TX1IF為1 void putch(unsigned CHAR byte) { while(!TX1IF)continue; TX1IF = 0; TXREG1 = byte; } //檢查中斷標(biāo)志 void putch(unsigned CHAR byte) { TX1IF = 0; TXREG1 = byte; while(!TX1IF)continue; } 詳細(xì)的可以參考器件的datasheet和編譯器的使用說明 另外LZ應(yīng)該養(yǎng)成一個(gè)好的習(xí)慣,包含的條件應(yīng)該比較完善 if(i==8) { i=0; } i++; 那么如果i的入口條件>8呢?只有到溢出至下一次達(dá)到條件,如果改為 if(i>=8)就可以更快的達(dá)到條件,同時(shí)也可以有效避免訪問超限的地址,這在寫操作中尤為重要。 |
|
| 8樓: | >>參與討論 |
| 作者: lwsogood 于 2006/9/26 9:00:00 發(fā)布:
樓上的兄弟 發(fā)送中斷標(biāo)志位,DATASHEET里面說是由硬件來置為復(fù)位的啊。而且我用的是非中斷的方式。只是想用最簡單的程序做測試?墒恰。。。5555555 還是不行…………………… |
|
| 9樓: | >>參與討論 |
| 作者: lwsogood 于 2006/9/26 12:31:00 發(fā)布:
好像是我復(fù)位電路有問題 檢查硬件ING^^^^^^^^^^^^^^^ |
|
| 10樓: | >>參與討論 |
| 作者: nuaahb 于 2006/9/29 11:13:00 發(fā)布:
求PIC單片機(jī)12位格雷碼轉(zhuǎn)換到相應(yīng)二進(jìn)制數(shù)的原程序代碼 那位大蝦有,請告知我,qq :452853915,不勝感激!1 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |