久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2222|回復: 8
打印 上一主題 下一主題
收起左側

STC單片機串口2字符傳送程序效率的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:283954 發表于 2019-1-25 13:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我從STC說明書抄下來用UART2發送字符的程序,雖然用起來沒問題,但對于其必須在那里白白等待(UART2_Send_Wait)字符傳送完畢,產生中斷置位TI才能離開不很理解,為何不是放下字符R4后馬上離開去干別的事,讓中斷來通知你可以再來傳字符呢?有沒有更有效率的串口傳送程序?各位論壇大佬有何高見呢?


SENTONEBYTE2:      ;SENT OUT DATA IN R4
PUSH ACC
MOV IE2, #00H        ;Disable the secondary UART interrupt, ES2=0
MOV A, S2CON         ;1111,1101, Clear secondary UART transimit interrupt flag
ANL A, #0FDH
MOV S2CON, A
MOV S2BUF, R4        
UART2_Send_Wait:
MOV A, S2CON
ANL A, #02H           ;0000,0010
CJNE A,#02H, UART2_Send_Wait
MOV A, S2CON
ANL A, #0FDH         ;1111,1101, Clear secondary UART transimit interrupt flag
MOV S2CON, A
MOV IE2, #01H        ;Enable the secondary UART interrupt, ES2=1
POP ACC
NOP
NOP
NOP
NOP
RET
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:283954 發表于 2019-1-25 13:32 | 只看該作者
另一個問題是,如果這個串口只是單純用來傳送字符就沒有問題,如果還要同時接收字符,那么在傳送等待期間如果有接收到字符,由于串口中斷(IE2)被關掉了,無法產生接收中斷RI, 那不是要丟失接收到的字符了嗎?
回復

使用道具 舉報

板凳
ID:303394 發表于 2019-1-25 14:57 | 只看該作者
可以啊,配置中斷發送和接收,在中斷中去處理不就好了,在有發送完成中斷時,再放入下一個字節,不過這樣就需要你先開一個緩沖區或者隊列,對于51來說,RAM都比較小,這么開緩沖區,對你的RAM的使用來說是個問題。

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:283954 發表于 2019-1-26 02:59 | 只看該作者
這么說來說明書上的范例不是最好的串口傳送方法了,我的程序是已經有緩沖區了,而STC12的內存是很夠的,我還沒學過一個串口同時發送和接收,有點擔心寫不出。我是想用“放了就走,要再放之前先看看是否已經傳完(TI已經置位)的方式試一下,而且整個過程不關中斷,不知是否可行。
回復

使用道具 舉報

5#
ID:123289 發表于 2019-1-27 10:34 | 只看該作者
范例的目標是:說明一個問題。
把程序寫的科學合理是:綜合性的問題。
目的不同,手法不同而矣。不要認為范例是最好的,就可以了。學習不能太機械。
關于串行通訊,串行一個字節,對于CPU來說,需要很久時間,CPU在此時間內可以執行上千條指令,所以樓主的想法是對的。也是通用的。
回復

使用道具 舉報

6#
ID:250700 發表于 2019-1-28 15:32 | 只看該作者
答案是肯定的,你只要開出一個字符串發送緩沖區就可以了,在串口發送字符串時先把字符串送入緩沖區加結束符,啟動串口發送,產生發送中斷后發送下一字節直到發送結束,有接收中斷照樣可以接收。
回復

使用道具 舉報

7#
ID:283954 發表于 2019-1-30 01:51 | 只看該作者
謝謝各位指導,看來得用這個新年寫一個收發的程序看看,串口通訊已經發明了很多年,不能充分掌握實在不能算是掌握單片機,初學單片機自然把說明書上的范例當成權威標準,不敢稍微改動,熟悉后就想打主意了。
回復

使用道具 舉報

8#
ID:283954 發表于 2019-1-31 03:15 | 只看該作者
終于寫出來了,用串口助手從PC送字串給單片機UART2,接收后放進緩沖,然后再送回UART2,由PC接收,對照一下沒有錯碼,應該是OK了吧。

LED:     
DJNZ 3AH, LED1 ;THIS IS FOR LEDSHOWDELAY
DJNZ 3BH, LED1
MOV P2, 3CH
DJNZ 3CH, LED1
JNB 39H, LEDA
CLR 39H
CPL P1.5       ;INDICATE LED LIGHTUP
MOV 3CH, #1
JMP LED1
LEDA:
SETB 39H
CPL P1.5
MOV 3CH, #2
LED1:
MOV A, R0
XRL A, R1
JZ LED
MOV A, @R0
MOV R4, A
LCALL SENTONEBYTE2
LCALL NEXTBUFFER0
JMP LED

NEXTBUFFER0:
CJNE R0, #LASTBUFFER, NEXTBUFFER0A
MOV R0, #FIRSTBUFFER
JMP NEXTBUFFER0EXIT
NEXTBUFFER0A:
INC R0  ;POINT TO NEXT BYTE
NEXTBUFFER0EXIT:
RET

NEXTBUFFER1:
CJNE R1, #LASTBUFFER, NEXTBUFFER1A
MOV R1, #FIRSTBUFFER
JMP NEXTBUFFER1EXIT
NEXTBUFFER1A:
INC R1           ;POINT TO NEXT BUFFER
NEXTBUFFER1EXIT:
RET

SENTONEBYTE2:        ;SENT OUT DATA IN R4
PUSH ACC
PUSH PSW
CHECKTI:
MOV A, S2CON         ;READ AND CHECK S2TI
ANL A, #00000010B    ;MASK EXCEPT BIT1(S2TI)
JZ CHECKTI
MOV A, S2CON
ANL A, #11111101B    ;CLEAR SECONDARY UART TRANSIMIT INTERRUPT FLAG
MOV S2CON, A
MOV S2BUF, R4
POP PSW
POP ACC
RET

UART2:                ;THIS RECEIVED DATA AND STORE TO BUFFER FOR SENTOUT
;/*----------------------------
;UART2 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
MOV  A, S2CON                ;READ UART2 CONTROL REGISTER
ANL A, #00000001B            ;ANL, IF S2RI=0 THEN 0
JZ UART2CHECKTI
MOV A, S2BUF
MOV @R1, A
LCALL NEXTBUFFER1
MOV A, S2CON                 ;READ UART2 CONTROL REGISTER AGAIN
ANL A, #11111110B            ;CLEAR S2RI BIT
MOV S2CON, A                 ;SAVE BACK S2CON
JMP UART2EXIT
UART2CHECKTI:                ;NOT USE
; --------DO NOTHING                 
UART2EXIT:
POP    PSW
POP    ACC
RETI

INITIAL_UART2:         ;USE FOR CLOCK OUT MIDI DATA; USE BRT
MOV S2CON, #01010010B  ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK, MUST SET S2TI TO 1 FOR TRANSMIT START
MOV BRT, #BRTLOAD      ;RELOAD 1152000
ORL AUXR, #10H         ;BRT START RUN
MOV IE2, #01H          ;ENABLE UART2 INTERRUPT
RET
回復

使用道具 舉報

9#
ID:283954 發表于 2019-2-2 13:32 | 只看該作者
上面那個程序對于單個UART運作起來似乎沒有什么問題,但是當有兩個UART需要同時收發就出問題了,原因是:兩個UART的接收標志TI,S2TI都長時間置位,會互掐,就看誰的中斷優先權高,低的那個接收到字符也不產生中斷,難怪我看到一些范例有BUSY BIT 的設置,啟用BUSY BIT 概念后,改寫一下,問題就解決了。

INITIAL_UART1:  
MOV SCON, #01010000B            ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
MOV TH1, #RELOAD_COUNT        
MOV TL1, #RELOAD_COUNT
SETB PS                         ;SERIAL PORT PRORITY HIGH
SETB TR1                        ;RUN TIMER_1
SETB ES                         ;ENABLE UART1 INTERRUPT
RET

UART1:
;/*----------------------------
;UART1 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
JNB RI, UART1CHECKTI
CLR RI
MOV A, SBUF                     ;READ THE CHARACTER FROM THE SERIAL PORT
MOV @R1, A
CALL NEXTBUFFER1
JMP UART1EXIT
UART1CHECKTI:
CLR TI
CLR 40H                         ;CLEAR BUSY BIT
UART1EXIT:
POP PSW
POP ACC
RETI

SENTONEBYTE1:                   ;SENT OUT DATA IN R4
PUSH ACC
PUSH PSW
CHECKBUSY1:
JB 40H, CHECKBUSY1
SETB 40H                        ;MARK BUSY BIT
MOV SBUF, R4
POP PSW
POP ACC
RET

INITIAL_UART2:         
MOV S2CON, #01010000B  ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
MOV BRT, #BRTLOAD      ;RELOAD
ORL AUXR, #10H         ;BRT START RUN
MOV IP2, #01H          ;UART INTERUUPT PARITY HIGH
MOV IE2, #01H          ;ENABLE UART2 INTERRUPT
RET

UART2:               
;/*----------------------------
;UART2 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
MOV P0, #01010101B
MOV  A, S2CON                ;READ UART2 CONTROL REGISTER
ANL A, #00000001B            ;ANL, IF S2RI=0 THEN 0
JZ UART2CHECKTI
MOV A, S2BUF
MOV @R1, A
LCALL NEXTBUFFER1
MOV A, S2CON                 ;READ UART2 CONTROL REGISTER AGAIN
ANL A, #11111110B            ;CLEAR S2RI BIT
MOV S2CON, A                 ;SAVE BACK S2CON
JMP UART2EXIT
UART2CHECKTI:               
MOV A, S2CON                 ;READ UART2 CONTROL REGISTER AGAIN
ANL A, #11111101B            ;CLEAR S2TI BIT
MOV S2CON, A
CLR 41H                      ;CLEAR BUSY BIT
UART2EXIT:
POP    PSW
POP    ACC
RETI

SENTONEBYTE2:                ;SENT OUT DATA IN R4
PUSH ACC
PUSH PSW
CHECKBUSY2:
JB 41H, CHECKBUSY2
SETB 41H                     ;MARK BUSY BIT
MOV A, S2CON
MOV S2BUF, R4
POP PSW
POP ACC
RET
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级毛片视频 | 一级毛片,一级毛片 | 精品视频一区二区三区在线观看 | 亚洲国产精品久久久久婷婷老年 | 亚洲乱码一区二区三区在线观看 | 又黑又粗又长的欧美一区 | 一区二区三区国产视频 | 国产精品毛片久久久久久久 | 欧美日韩在线精品 | 日韩在线中文字幕 | h在线免费观看 | 欧美综合在线观看 | 精品国产视频在线观看 | 精品欧美一区二区三区免费观看 | 蜜臀久久 | 综合欧美亚洲 | 亚洲精品在线免费 | 久久精品一级 | 99精品视频一区二区三区 | av黄色片在线观看 | 国产一区影院 | 四虎影院免费在线播放 | 一区二区成人 | 一区二区三区国产 | 国产乱码精品一区二区三区中文 | 精品久久久久久久久久久久久久 | 一区二区三区不卡视频 | heyzo在线 | 国产亚韩 | 激情一区二区三区 | 成人欧美一区二区 | 成人在线免费电影 | 97狠狠干| 日中文字幕在线 | 日韩成人免费视频 | 性色网站| 中文精品视频 | 欧美日韩中文国产一区发布 | 麻豆hd | 日本国产一区二区 | 波多野结衣在线观看一区二区三区 |