|
|||||||||||
| 技術(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 |
如何用串口連續(xù)接收5個(gè)字節(jié)?連續(xù)中斷5次嗎? |
| 作者:bosszc 欄目:單片機(jī) |
請(qǐng)教大狹 有個(gè)儀器每秒從串口發(fā)送5個(gè)字節(jié),我用單片機(jī)從儀器的串口要讀出這5個(gè)字節(jié) .我的方法是用單片機(jī)連續(xù)中斷5次來讀的.但是好沒有收到數(shù)據(jù),請(qǐng)問是什么原因? 由于儀器每秒是連續(xù)發(fā)送五個(gè)字節(jié)的數(shù)據(jù),中間沒有間斷, 但是單片機(jī)每次的串口中斷只能接受一個(gè)字節(jié),是不是要連續(xù)中斷五次才能讀完五字節(jié)。下面是接收數(shù)據(jù)的部分程序 每次中斷返回后都在等待新一次的中斷, ........... mov r0,#10h ........... org 0023h receive_data: jnb ri,$ clr ri clr ex1 ;禁止外部按鍵中斷 mov a,sbuf mov @r0,a inc r0 cjne r0,#15h,wait mov r0,#10h wait: reti 波特率4800,n,8,1 定時(shí)器t1方式2,串口方式1. |
| 2樓: | >>參與討論 |
| 作者: 夏蟲 于 2005/11/29 10:05:00 發(fā)布:
單片機(jī)的接收緩沖區(qū)只有一個(gè)字節(jié)的空間 單片機(jī)的接收緩沖區(qū)只有一個(gè)字節(jié)的空間,不可能一次接收5個(gè)字節(jié) |
|
| 3樓: | >>參與討論 |
| 作者: yang96381 于 2005/11/29 10:22:00 發(fā)布:
呵呵,制定通信協(xié)議。! |
|
| 4樓: | >>參與討論 |
| 作者: sclarkca 于 2005/11/29 12:02:00 發(fā)布:
不應(yīng)該會(huì)這樣的 你第一個(gè)字節(jié)能收到嗎? |
|
| 5樓: | >>參與討論 |
| 作者: lishuanghua 于 2005/11/29 12:20:00 發(fā)布:
你老在中斷中等待新的中斷,這樣是不行的 |
|
| 6樓: | >>參與討論 |
| 作者: isoar 于 2005/11/29 12:29:00 發(fā)布:
他老人家的匯編寫得不怎么樣 |
|
| 7樓: | >>參與討論 |
| 作者: tzfzephyr 于 2005/11/29 13:39:00 發(fā)布:
你這樣只能收到一個(gè)數(shù)據(jù) |
|
| 8樓: | >>參與討論 |
| 作者: bosszc 于 2005/11/29 15:05:00 發(fā)布:
需要什么樣的通信協(xié)議. 我也知道一次中斷,只能讀取一個(gè)字節(jié)! 所以我采用了中斷五次的方法, 注意:每接受到一個(gè)字節(jié)后中斷會(huì)返回的,并不是在中斷中等中斷!!! 而且每過一秒,接受到的數(shù)據(jù)都會(huì)更新.就是重寫10h~14h這5個(gè)單元. yang96381你好: 不知道您能不能具體一點(diǎn)呢?需要什么樣的通信協(xié)議. |
|
| 9樓: | >>參與討論 |
| 作者: jjg 于 2005/11/29 21:01:00 發(fā)布:
如果是每次固定收5個(gè)字節(jié)的數(shù)據(jù),那你可以在中斷中連續(xù)收5個(gè)。 進(jìn)入中斷連續(xù)接收5個(gè)字節(jié)后再退出中斷。 |
|
| 10樓: | >>參與討論 |
| 作者: 艾森豪威爾 于 2005/12/1 8:26:00 發(fā)布:
支持樓上 |
|
| 11樓: | >>參與討論 |
| 作者: xymxym 于 2005/12/1 11:48:00 發(fā)布:
中斷里面接收一個(gè)字節(jié)放入緩沖數(shù)組后退出,不要死等! 數(shù)組指針加1,再通過數(shù)組指針判斷字節(jié)數(shù)是否達(dá)到了5個(gè)字節(jié)(也可以再用一個(gè)變量來作為計(jì)數(shù),并與數(shù)組初值下標(biāo)相加,相加后的和就是當(dāng)前要存入的數(shù)組單元了,同時(shí)這個(gè)變量作為判斷接收字節(jié)數(shù)的依據(jù)),如果達(dá)到了5個(gè)字節(jié),則將數(shù)組指針重置初值(為下一次5個(gè)字節(jié)的接收作準(zhǔn)備,如果用了計(jì)數(shù)變量的話,也要將變量置0x00)并置接收完畢的標(biāo)致為1,在主程序里面去判斷這個(gè)標(biāo)致并相應(yīng)處理就行了!怎么處理樓主應(yīng)該會(huì)吧? * - 本貼最后修改時(shí)間:2005-12-1 11:52:48 修改者:xymxym |
|
| 12樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/1 14:16:00 發(fā)布:
發(fā)送數(shù)據(jù)的協(xié)議是:4800,N,8,1 每秒一次,每次5字節(jié) 多謝這末多大狹來參加討論,還是要說明一下: 1.儀器的串口發(fā)送數(shù)據(jù)的協(xié)議是:4800,N,8,1 這個(gè)與接收端單片機(jī)串口設(shè)置為:定時(shí)器t1方式2,串口方式1,波特率 4800是否有什么問題或者不符? 2.現(xiàn)在的問題是接受不到數(shù)據(jù)而不是接收到后怎末處理的問題. 3.有人建議在中斷中連續(xù)接收5字節(jié),不知道如何可以在一次串口中斷中實(shí)現(xiàn),請(qǐng)指點(diǎn). 請(qǐng)大家指點(diǎn).謝謝. |
|
| 13樓: | >>參與討論 |
| 作者: 夏蟲 于 2005/12/1 14:55:00 發(fā)布:
偶也不明白 偶也不明白怎么在一次中斷中連續(xù)接收5次?這跟5次中斷有什么區(qū)別? |
|
| 14樓: | >>參與討論 |
| 作者: xymxym 于 2005/12/1 15:46:00 發(fā)布:
你要把串口方面初始化程序貼出來大家才能知道啊 比如,TH1,TL1是多少,晶振是多少,TR1=等1?ES=1?EA=1?這樣子誰知道你設(shè)的是不是4800bps,是否有沒有使能串口中斷!! |
|
| 15樓: | >>參與討論 |
| 作者: 南方的老樹 于 2005/12/1 18:35:00 發(fā)布:
不好在中斷中連續(xù)接收n個(gè)字節(jié),因?yàn)椴荒鼙WC對(duì)方不會(huì)少發(fā)一個(gè) |
|
| 16樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/1 18:44:00 發(fā)布:
暈~~~"每秒是連續(xù)發(fā)送五個(gè)字節(jié)的數(shù)據(jù),中間沒有間斷" 停止位是干暈事的??? * - 本貼最后修改時(shí)間:2005-12-1 18:46:42 修改者:hotpower
|
|
| 17樓: | >>參與討論 |
| 作者: 啊龍 于 2005/12/1 23:05:00 發(fā)布:
有意思,如果你只是接收, 不必判斷RI,直接清除,數(shù)據(jù)讀入緩沖即可不好做的是,你如何能保證接收的5個(gè)數(shù)據(jù)同發(fā)送的5個(gè)數(shù)據(jù)同步,需要協(xié)議 |
|
| 18樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/2 9:35:00 發(fā)布:
回復(fù): xymxym "比如,TH1,TL1是多少,晶振是多少,TR1=等1?ES=1?EA=1?這樣子誰知道你設(shè)的是不是4800bps,是否有沒有使能串口中斷。!" 波特率設(shè)置沒有問題的!!!!晶振11.0592MHZ,TR1=1,ES=1,EA=1 中斷是使能的. 每次發(fā)送的第5個(gè)字節(jié)都是0dh,硬件是通過COM1口的3線簡單接法. |
|
| 19樓: | >>參與討論 |
| 作者: stering 于 2005/12/2 9:57:00 發(fā)布:
我是5次中斷 反正我做的422的通訊協(xié)議是一次中斷一個(gè)字節(jié)的。樓上高手不知道能不能詳細(xì)介紹怎么在一次中斷里取5個(gè)數(shù) |
|
| 20樓: | >>參與討論 |
| 作者: water2005 于 2005/12/2 20:41:00 發(fā)布:
re 我想阿龍說的有道理,如何保證接收和發(fā)送一致,有可能發(fā)送5個(gè),只接收到4個(gè),或者像老樹說的那樣。如果實(shí)現(xiàn)了同步應(yīng)該可以 * - 本貼最后修改時(shí)間:2005-12-2 20:49:04 修改者:water2005 |
|
| 21樓: | >>參與討論 |
| 作者: quliuwuhen 于 2005/12/3 10:54:00 發(fā)布:
串口設(shè)置問題 |
|
| 22樓: | >>參與討論 |
| 作者: xhf001 于 2005/12/3 10:58:00 發(fā)布:
給你個(gè)程序 COM: PUSH ACC PUSH PSW MOV PSW,#10H JB TI,COM1 CLR RI MOV A,SBUF MOV @R0,A INC R0 INC R2 CJNE R2,#05H,COM2 MOV R2,#00H ;5字節(jié)計(jì)數(shù)器 MOV R0,#30H ;數(shù)據(jù)存放起始地址 SETB 02H ;完畢標(biāo)志 COM2: POP PSW POP ACC RETI COM1: CLR TI ----- ----- POP PSW POP ACC RETI |
|
| 23樓: | >>參與討論 |
| 作者: xchangjun 于 2005/12/3 11:08:00 發(fā)布:
用串口接收 你可用串口rx接收,同時(shí)注意波特率及位數(shù)的設(shè)置 |
|
| 24樓: | >>參與討論 |
| 作者: SupermanTm 于 2005/12/3 13:25:00 發(fā)布:
可以通過幀間隔期來實(shí)現(xiàn)同步的 協(xié)議約定,發(fā)送端發(fā)出的數(shù)據(jù)是連續(xù)的(一幀內(nèi)的相鄰兩個(gè)字節(jié)之間間隔不超過1byte的時(shí)間) 接收端每發(fā)生RI中斷即對(duì)計(jì)時(shí)器復(fù)位,當(dāng)計(jì)時(shí)器到的時(shí)候就設(shè)定為幀同步狀態(tài)。 最節(jié)約資源的方法是,如果使用半雙工的通訊,讓發(fā)送始終發(fā)生(可通過外部器件封鎖發(fā)送),那么在兩次RI之間經(jīng)過兩次的TI中斷則視作幀同步。 |
|
| 25樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/3 16:15:00 發(fā)布:
如何才能實(shí)現(xiàn)同步呢????????? 如何才能實(shí)現(xiàn)同步呢????????? 還是協(xié)議的問題吧???? 需要什么樣的協(xié)議呢? |
|
| 26樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/3 16:20:00 發(fā)布:
現(xiàn)在第一個(gè)字節(jié)也收不到!!!!!!!!! 現(xiàn)在第一個(gè)字節(jié)也收不到!!!!!!!!! 需要什么樣的協(xié)議呢?? 如何才能同步呢? 儀器是一次連續(xù)發(fā)送5字節(jié),中間好象沒有停止位,只是最后一個(gè)字節(jié)為0xd,表示一次發(fā)送完!! |
|
| 27樓: | >>參與討論 |
| 作者: 南方的老樹 于 2005/12/3 16:23:00 發(fā)布:
協(xié)議已經(jīng)規(guī)定了,有個(gè)尾也可以 然后倒推,2個(gè)尾之間如果是4個(gè)字節(jié)那就是有效數(shù)據(jù) |
|
| 28樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/3 16:25:00 發(fā)布:
如何同步呢???? |
|
| 29樓: | >>參與討論 |
| 作者: dengm 于 2005/12/3 17:39:00 發(fā)布:
re: 給你改一下, 要學(xué)會(huì)用 XRL RX_BUF EQU 10H FRAM_LEN EQU 5 END_CODE EQU 0DH ........... mov r0,#RX_BUF ;10h MOV (RX_BUF+FRAM_LEN-1), #(END_CODE+1) ; 不等于 end_code ........... org 0023h receive_data: JBC RI, RX_A clr TI RETI .......... RX_A: PUSH ACC mov a,sbuf ;******* clr ex1 ;禁止外部按鍵中斷 mov @r0,a XRL A, #END_CODE JZ RX_B MOV A, #(RX_BUF + FRAM_LEN-1) XRL A, R0 INC R0 JNZ RX_X RX_B: MOV R0, #RX_BUF RX_X: POP ACC reti * - 本貼最后修改時(shí)間:2005-12-3 17:49:33 修改者:dengm |
|
| 30樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/3 18:29:00 發(fā)布:
這個(gè)儀器是主動(dòng)發(fā)送數(shù)據(jù)的 注意:這個(gè)儀器是主動(dòng)發(fā)送數(shù)據(jù)的,所以如何實(shí)現(xiàn)握手信號(hào)是個(gè)問題,同步也是難題. |
|
| 31樓: | >>參與討論 |
| 作者: happylover 于 2005/12/3 18:59:00 發(fā)布:
不合理 首先你的程序就有問題,在進(jìn)入中斷后,你知道ri標(biāo)志位要清零,但在等待的之前就應(yīng)該先將ri標(biāo)志位清零,不然就一直帶等待 再次,這么做如果出現(xiàn)了誤碼的話,在現(xiàn)在這樣的程序下,不好解決誤碼重發(fā)的問題,也就是上面幾位朋友說到的.還是做好協(xié)議,用置標(biāo)志位的方法好一些. |
|
| 32樓: | >>參與討論 |
| 作者: liumsn 于 2005/12/4 15:02:00 發(fā)布:
當(dāng)然一次中斷一個(gè)字節(jié),自己另外定一個(gè)緩沖嘛 |
|
| 33樓: | >>參與討論 |
| 作者: 艾森豪威爾 于 2005/12/6 16:24:00 發(fā)布:
如果是每秒一次,每次5字節(jié),那最好別一次中斷收5個(gè)字節(jié) 因?yàn)槟菢佑锌赡軐?duì)方發(fā)送得很慢(比方說每隔200ms發(fā)一個(gè)字節(jié)),那么你進(jìn)一次中斷要在中斷里面等一秒,這是不允許的。 所以建議還是采取一次中斷接收一個(gè)字節(jié)的方法。 下面是一次中斷接收多個(gè)字節(jié)的例子(至少接收兩個(gè)字節(jié)): unsinged CHAR SerialBuf[N]; unsinged CHAR*SerialBufp=SerialBuf; unsigned CHAR i; void serial_isr(void) { while(1) { i=0; if(RI==1) RI=0; *SerialBufp++=SBUF; while(!RI) { if(i++ > 300)//估計(jì)值 break; } *SerialBufp++=SBUF; if((SerialBufp-SerialBuf)==N) break; } } |
|
| 34樓: | >>參與討論 |
| 作者: bosszc 于 2005/12/11 9:57:00 發(fā)布:
多謝各位大狹的幫助,問題已經(jīng)解決!!! |
|
| 35樓: | >>參與討論 |
| 作者: 肖敏鋒 于 2005/12/12 0:24:00 發(fā)布:
你的中斷程序應(yīng)保證執(zhí)行時(shí)間應(yīng)小于10B的數(shù)據(jù)傳輸時(shí)間。 接收5個(gè)數(shù)據(jù),設(shè)緩沖區(qū) 5次中斷是比較好的,個(gè)人認(rèn)為 你非要在一次接受5個(gè)也可以。就是效率不敢恭維 |
|
| 36樓: | >>參與討論 |
| 作者: LFSLY 于 2005/12/12 8:45:00 發(fā)布:
你要把串口中斷設(shè)為第一高優(yōu)先級(jí) |
|
| 37樓: | >>參與討論 |
| 作者: zhwdy81 于 2005/12/12 11:24:00 發(fā)布:
我做過的,很容易就實(shí)現(xiàn)的 我用的是moto的,連續(xù)接收都做過的,沒問題的,無論是模塊,還是用軟件來模擬的,都很容易實(shí)現(xiàn)的。 如果是接收不到的話,或亂碼的話最好也看一下設(shè)置,通常都是在波特率上出問題。 |
|
| 38樓: | >>參與討論 |
| 作者: bosszc 于 2006/1/9 11:37:00 發(fā)布:
問題都解決了 問題都解決了....謝謝大家參與討論!決定!決定 |
|
| 39樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/1/9 15:18:00 發(fā)布:
說說怎么解決的啊。〈蠹夜餐窒砺 |
|
| 40樓: | >>參與討論 |
| 作者: huxiangbin 于 2006/1/9 21:09:00 發(fā)布:
就是怎么解決的呀? |
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |