|
|||||||||||
| 技術(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 |
51單片機(jī)串口通訊問題求解,請幫忙分析,謝謝! |
| 作者:hgchenkv 欄目:單片機(jī) |
我在做串口調(diào)試實(shí)驗(yàn)時,PC與51的通訊,依次輸入1234567890a~z串行通訊顯示出來的結(jié)果如下所示,英文字母的錯誤還能接受,但那個數(shù)字的誤 碼率太高了啊,請各位高手幫忙分析一下,謝謝了! qq11qq1q1qqqq1r222rr34t5uu5uuvvv 677w88xy999y0p00pp0abcdefghIjklmnopqrstuvwxyzz 程序如下: #include<reg51.h> void main() { unsigned int a[10]; TMOD=0x20;//方式2 TL1=0xF3;//波特率為4800的初值 TH1=0xF3; SCON=0x54;//串口工作在方式1 PCON=0x80;//SMOD=1 TR1=1; while(1) { while(RI==0); RI=0; a[10]=SBUF; SBUF=a[10]; while(TI==0); TI=0; } } |
| 2樓: | >>參與討論 |
| 作者: 彪哥 于 2006/3/27 14:17:00 發(fā)布:
接收后發(fā)回去 直接將接收后的字符存在一個變量里,先發(fā)一個,看碼率對不對。 void delay(void) { unsigned CHAR i=255; while(--i); } void main() { unsigned CHAR a; TMOD=0x20;//方式2 TL1=0xF3;//波特率為4800的初值 TH1=0xF3; SCON=0x54;//串口工作在方式1 PCON=0x80;//SMOD=1 TR1=1; while(1) { while(RI==0); RI=0; a=SBUF; delay(); SBUF=a; while(TI==0); TI=0; } } |
|
| 3樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/27 14:45:00 發(fā)布:
彪哥,先謝了 彪哥,先謝了,但是還是跟剛才一樣啊,沒有什么改變,而且又出現(xiàn)了一個新問題就是:發(fā)送大寫的英文字母也跟發(fā)送數(shù)字有一樣的效果,收到的不是亂碼就是小寫的字母啊,求各位了!!! |
|
| 4樓: | >>參與討論 |
| 作者: hunao 于 2006/3/27 16:10:00 發(fā)布:
晶振是多少? |
|
| 5樓: | >>參與討論 |
| 作者: xzlrhlg 于 2006/3/27 16:28:00 發(fā)布:
PC機(jī)與單片機(jī)波特率一樣? |
|
| 6樓: | >>參與討論 |
| 作者: diannaoza 于 2006/3/27 19:40:00 發(fā)布:
串口通訊 ;;;;;;;;;;;;;;;;;;;;;11.0592MHZ;;;;;;;;;;;;; TMOD=0x20;//方式2 Th1=0xF4;//波特率為2400的初值;;; PCON=0x80;//SMOD=1;;;4800 |
|
| 7樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/27 22:15:00 發(fā)布:
我的晶振是12M的啊,應(yīng)該沒什么問題吧? 還有我的單片機(jī)和PC的波特率都是4800,現(xiàn)在我就不懂到底是什么問題了啊,還請各位高手分析,謝謝! |
|
| 8樓: | >>參與討論 |
| 作者: eyesonme 于 2006/3/28 9:52:00 發(fā)布:
有沒有問題,算算就知道了 根據(jù)晶振,確認(rèn)相應(yīng)寄存器的初始值是否準(zhǔn)確。然后看看程序的代碼有無錯誤。你完全可以先只接收和發(fā)送單一字符,然后再看看數(shù)組的顯示對不 |
|
| 9樓: | >>參與討論 |
| 作者: zhaoruixbj 于 2006/3/28 11:09:00 發(fā)布:
不是要11.0592MHZ的晶振嗎 串口通信不是要11.0592MHZ的晶振嗎 |
|
| 10樓: | >>參與討論 |
| 作者: ttjlc 于 2006/3/28 11:52:00 發(fā)布:
實(shí)在不行,用示波器量波特率 晶振當(dāng)然由你自己選擇了,11.0592最適合9600波特率,當(dāng)然不是說其它波特率就不行了,你自己算一下波特率就知道了。 |
|
| 11樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/28 13:07:00 發(fā)布:
樓上的諸位高手好 我的晶振用的是12M的,而且根據(jù)計(jì)算波特率也應(yīng)該是4800最適合,包括定時器的初值設(shè)定也是通過我計(jì)算和參考別人的啊,網(wǎng)上也有這方面的資料,我基本上參考的就是那個,但是現(xiàn)在顯示的就是單片機(jī)發(fā)送16進(jìn)制時,PC接受的老是一位對一位錯(比如發(fā)0x30\0xAF,收到的卻是0x70\0x6F),我真的就不知道為什么?小弟先謝謝各位了! |
|
| 12樓: | >>參與討論 |
| 作者: power5000 于 2006/3/28 13:21:00 發(fā)布:
串口工作在方式 |
|
| 13樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/28 13:53:00 發(fā)布:
power5000 你好 power5000 你好,串口工作在方式1有問題嗎? |
|
| 14樓: | >>參與討論 |
| 作者: margaret03 于 2006/3/28 17:23:00 發(fā)布:
你用的串口調(diào)試軟件設(shè)置的是否正確? |
|
| 15樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/28 18:13:00 發(fā)布:
margaret03 margaret03 你好!串口調(diào)試軟件的設(shè)置跟單片機(jī)程序中的設(shè)置完全一致啊,請?jiān)賻兔Ψ治鲆幌掳?謝謝! |
|
| 16樓: | >>參與討論 |
| 作者: dengm 于 2006/3/28 18:45:00 發(fā)布:
用示波器看一下,可能是硬件問題 |
|
| 17樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/29 23:10:00 發(fā)布:
再求各位幫忙啊,謝謝! |
|
| 18樓: | >>參與討論 |
| 作者: ukgo 于 2006/3/30 12:11:00 發(fā)布:
恩 1.可以先在300波特的速率下檢驗(yàn)一下硬件電路和軟件是否正常。 (用示波器檢查串口波形) 2.硬件和軟件都正常,再檢查2400的波特率在晶振是12M時是否好用。 (當(dāng)然,晶振最好選11.0592MHZ的) * - 本貼最后修改時間:2006-3-30 12:20:31 修改者:ukgo |
|
| 19樓: | >>參與討論 |
| 作者: pilibeibei 于 2006/3/30 12:58:00 發(fā)布:
程序有問題 a[10]=SBUF; SBUF=a[10]; 你不覺得別扭嗎?你是把SBUF中的數(shù)據(jù)存到數(shù)組中嗎? 你是把數(shù)組中的數(shù)據(jù)放到SBUF中去嗎? 建議你要么用循環(huán),要么用指針,一個一個傳值 |
|
| 20樓: | >>參與討論 |
| 作者: szxw 于 2006/3/30 22:28:00 發(fā)布:
晶振換成11.0592MHZ! 12MHZ的不行,誤差太大~ |
|
| 21樓: | >>參與討論 |
| 作者: dai_weis 于 2006/3/30 23:15:00 發(fā)布:
通訊速率和CRC 串行通訊要有校驗(yàn)碼,12M晶振產(chǎn)生的串口速率要選擇整倍率的發(fā)送速度,要不會出現(xiàn)不定期的錯誤 |
|
| 22樓: | >>參與討論 |
| 作者: teddeng 于 2006/3/31 3:45:00 發(fā)布:
把MCU拔了,短接RX/TX,PC自發(fā)自收,看正確否 |
|
| 23樓: | >>參與討論 |
| 作者: jacky-cheung 于 2006/3/31 8:57:00 發(fā)布:
拜托,別誤導(dǎo)人家,12M晶體沒問題。 拜托,別誤導(dǎo)人家,12M晶體沒問題。寫片看看,通信講究實(shí)時。 |
|
| 24樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/31 16:09:00 發(fā)布:
樓上的各位大俠好! 首先感謝各位大俠幫我認(rèn)真分析,各位各有自己的見解和經(jīng)驗(yàn),小弟先謝過了! 現(xiàn)在我又出現(xiàn)了新問題了,再請各位幫忙,也同時把我作出來的實(shí)驗(yàn)事實(shí)告訴大家,共同交流: 我現(xiàn)在用的晶振是12M的,發(fā)送還算正常吧,發(fā)送接受程序也有所改動,只發(fā)送和接受單個字符,程序如下: #include<reg51.h> void main() { unsigned int a[10]; TMOD=0x20;//方式2 TL1=0xF3;//波特率為2400的初值 TH1=0xF3; SCON=0x50;//串口工作在方式1 TR1=1; while(1) { while(RI==0); RI=0; a=SBUF; SBUF=; while(TI==0); TI=0; } } 現(xiàn)在結(jié)果是:當(dāng)調(diào)整波特率為2400時,發(fā)送和接受字母(a~z只小寫)正常,誤碼率10錯1吧,但換成大寫和數(shù)字錯誤率就很高了,當(dāng)調(diào)整波特率為1200時,數(shù)字的發(fā)送接受就正常了,其他的就不行了啊,各位這又是什么原因? |
|
| 25樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/3/31 16:15:00 發(fā)布:
接樓上的話 我聽幾位大哥大姐說,象我上邊那樣用查詢法發(fā)送接受不穩(wěn)定,應(yīng)該用串口中斷實(shí)現(xiàn)要求操作才比較穩(wěn)定啊,是嗎?請各位幫忙再分析一下,再提點(diǎn)額外的要求關(guān)于串口中斷我查了好多資料,但對他的工作過程還不是很了解,能否麻煩各位附個小程序?qū)ζ鋱?zhí)行步驟解釋一下,謝謝! |
|
| 26樓: | >>參與討論 |
| 作者: pilibeibei 于 2006/4/1 8:46:00 發(fā)布:
都說了是程序問題! 你定義了:unsigned int a[10]; 其實(shí)用的時候最大也只能用a[9]啊,要用a[10]定義時應(yīng)為unsigned int a[11]; |
|
| 27樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/4/1 13:57:00 發(fā)布:
不好意思 不好意思,各位,是我的筆誤啊,我的程序應(yīng)該是: #include<reg51.h> void main() { unsigned CHAR a; TMOD=0x20;//方式2 TL1=0xF3;//波特率為2400的初值 TH1=0xF3; SCON=0x50;//串口工作在方式1 TR1=1; while(1) { while(RI==0); RI=0; a=SBUF; SBUF=; while(TI==0); TI=0; } } 除了這個地方a [10]還有什么問題嗎?再請各位幫忙,謝謝! |
|
| 28樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/4/1 23:16:00 發(fā)布:
各位大俠幫幫忙啊,謝謝 |
|
| 29樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/4/3 12:02:00 發(fā)布:
???????? |
|
| 30樓: | >>參與討論 |
| 作者: hgchenkv 于 2006/4/4 11:10:00 發(fā)布:
感謝信 感謝這些天來,各位高手的指點(diǎn)和幫忙分析,通過諸位仁兄義姐的幫忙,我的串口通訊已經(jīng)基本實(shí)現(xiàn)了,當(dāng)然只是簡單的實(shí)現(xiàn),以后的深入實(shí)現(xiàn)還要繼續(xù)麻煩各位高手幫忙!再次感謝各位。! |
|
| 31樓: | >>參與討論 |
| 作者: ares_lan 于 2006/7/20 14:30:00 發(fā)布:
TO pilibeibei 你好!我就用過你說過的方法.用個循環(huán),但只能接收開始的一位.我后來又用串口中斷寫過,但是還是這種問題.不知道你的一個一個傳是怎么寫的.可不可以寫一段給我學(xué)習(xí)一下. 另外,在我理解來,串口調(diào)試助手發(fā)送一串字符,是連續(xù)發(fā)送的,8位寫入SBUF后,標(biāo)志位RI=1,然后把SBUF中的內(nèi)容寫進(jìn)緩存,然后TI=0開始接收.不知道我這樣的理解是不是對的.謝謝 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |