|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
51機RS485通信問題請教! |
| 作者:hustzch 欄目:單片機 |
我采用AT89LS51,外接一個MAX491來進行多機全雙工RS485通信。 在調(diào)試的時候先采用雙機通信,發(fā)現(xiàn)從機的總是接收不正確。只能接收0x55,例如0x95,0x20這樣的 字節(jié)就總是出錯。由于沒有RS485/RS232適配器,所以不能打到PC串口看數(shù)據(jù)。 我又一塊單片機,采用RS232接口和PC通信,采用相同的程序,使用串口調(diào)試精靈調(diào)試,發(fā)現(xiàn)接收和發(fā)送 都是正常的,請問這是怎么回事?謝謝 以下是我的源碼: /*********************************************** 主機 ***********************************************/ void main (void) { SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */ TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */ TH1 = 0xFD; /* 9600 Bds at 11.059MHZ */ TL1 = 0xFD; /* 9600 Bds at 11.059MHZ */ IE =0x90; TR1 = 1; /* Timer 1 run */ Rx_en=0; /* RS-485 Rx enable,'0'--enable; '1'--disable */ Tx_en=1; /* RS-485 Tx enable,'1'--enable; '0'--disable */ while(1) { SBUF=0x55; //只有0x55可以成功被從機接收 while(TI==0); TI=0; delay(100); LED_blink1(); /* If received a byte ,LED1 will blink */ } } void serial () interrupt 4 //接收采用中斷,發(fā)送不使用中斷 { if(RI) { CHAR uart_data; RI=0; uart_data=SBUF; SWITCH(uart_data) { case 0x25: LED_blink2(); break; default: break; } } } /*********************************************** 從機 ***********************************************/ void main (void) { CHAR shakehands; SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */ TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */ TH1 = 0xFD; /* 9600 Bds at 11.059MHZ */ TL1 = 0xFD; /* 9600 Bds at 11.059MHZ */ ES = 0; /* Disable serial interrupt */ EA = 0; /* Disable GLOBAL interrupt */ TR1 = 1;   |
| 2樓: | >>參與討論 |
| 作者: shixiudong 于 2005/1/15 22:08:00 發(fā)布:
很可能是485總線沖突了 檢查是否有多個輸出連在同一個總線中了。 這是經(jīng)常性錯誤。 |
|
| 3樓: | >>參與討論 |
| 作者: hustzch 于 2005/1/16 13:13:00 發(fā)布:
謝謝回復(fù) 我沒有完全明白你的意思。 我本是想做多機通信的,現(xiàn)在先用雙機調(diào)程序。所以總線上只有2個設(shè)備啊。 |
|
| 4樓: | >>參與討論 |
| 作者: xrb3115 于 2005/1/16 14:53:00 發(fā)布:
是否是485收發(fā)切換的時間不夠 |
|
| 5樓: | >>參與討論 |
| 作者: hustzch 于 2005/1/16 15:18:00 發(fā)布:
to xrb3115 我使用的是MAX491,采用的是全雙工485方式,輸入和輸出是獨立的通道, 雖然各有使能,但我一上電把他們都使能了。 我認為既然是全雙工,就沒有收發(fā)切換的問題了吧? |
|
| 6樓: | >>參與討論 |
| 作者: 1121 于 2005/1/16 17:58:00 發(fā)布:
輸入和輸出是獨立通道的全雙工485方式?直接說422不就得了。 你的發(fā)送程序或發(fā)送電路需要改進,關(guān)鍵的問題是你總在占用總線。 我看你是可以用PC來調(diào)試的,動下腦筋吧。 |
|
| 7樓: | >>參與討論 |
| 作者: lsn_061 于 2005/1/16 19:19:00 發(fā)布:
我也一直在做這個,能否交流呢 是不是延時的時間太少了? delay(100); |
|
| 8樓: | >>參與討論 |
| 作者: hustzch 于 2005/1/16 21:33:00 發(fā)布:
謝謝樓上的 我起初是用PC調(diào)試的,用的就是RS232和PC通信,PC端用串口調(diào)試精靈。 RS485是RS422的改進,有2線和4線兩種連接方式的。 我使用的是MAX491芯片,Datasheet上說明是應(yīng)用于full-duplex RS485 network,應(yīng)該是指全雙工RS485網(wǎng)絡(luò)吧,我也是第一次用這個片子。 后來發(fā)現(xiàn)硬件設(shè)計時,MAX491的VCC為5V的,但是接成3.3V了(不是俺設(shè)計的啊,冤的很),應(yīng)該是這個問題導(dǎo)致誤碼的吧! |
|
| 9樓: | >>參與討論 |
| 作者: 1121 于 2005/1/16 21:50:00 發(fā)布:
不是你設(shè)計的,你就沒責(zé)任了嗎?!為什么不好好檢查! 哈,說玩樂的啦,別介意。如果早些用示波器看一下波形就不用走彎路了。 RS485和RS422還是看下標準再說吧,在此不做深究了。 MAX某些IC都是按非標設(shè)計的,當然有些是超標的啦。 |
|
| 10樓: | >>參與討論 |
| 作者: hustzch 于 2005/1/16 22:01:00 發(fā)布:
呵呵,是啊,說的對 我是對我們的硬件設(shè)計的確很放心。沒想到出岔子出在VCC上,我悶著腦袋 搞了半天通信協(xié)議,都是有問題啊,真是ft了。 |
|
| 11樓: | >>參與討論 |
| 作者: 12864 于 2005/1/17 1:11:00 發(fā)布:
芯片是全雙工,但聯(lián)網(wǎng)就不是全雙工的了 起碼眾多從機的發(fā)送都是連接在一起的,從機為了避免總線沖突,必須是先收后發(fā),而且不該自己發(fā)的時候不能發(fā),更不能在任意時刻主動發(fā)起通信。 這樣看,還是全雙工嗎?當然在一主一從的時候是可以全雙工的。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |