標題:
51單片機串口通訊問題,大家看一下,是軟件問題,還是晶振問題,小白搞不定了
[打印本頁]
作者:
廖振基
時間:
2022-1-9 16:29
標題:
51單片機串口通訊問題,大家看一下,是軟件問題,還是晶振問題,小白搞不定了
單片機12MHZ晶振。軟件下載到單片機后問題表現(xiàn)為;
軟件設想的表現(xiàn)是;
單片機收到上位機發(fā)送的任何數(shù)據(jù)后,先回復:“收到”,再在“收到”后面貼上上位機發(fā)送的數(shù)據(jù)。
實際表現(xiàn)為,發(fā)送:1 回復;收到1 正常
發(fā)送;11 回復;收到1 不正常, 應該為“收到11”,
發(fā)送;111 回復:收到1 不正常, 應該為“收到111”,
發(fā)送;1111 回復;收到1 不正常, 應該“收到1111”,
發(fā)送;11111 回復;收到1收到 不正常, 應該為,“收到11111”,
把for循環(huán)注釋掉,也就是讓單片機收到什么回復什么,一切表現(xiàn)正常
[16:21:01.014]發(fā)→◇1
□
[16:21:01.045]收←◆收到1
[16:21:05.575]發(fā)→◇11
□
[16:21:05.606]收←◆收到1
[16:21:10.095]發(fā)→◇111
□
[16:21:10.126]收←◆收到1
[16:21:13.415]發(fā)→◇1111
□
[16:21:13.446]收←◆收到1
[16:21:16.631]發(fā)→◇11111
□
[16:21:16.682]收←◆收到1收到
[16:21:19.614]發(fā)→◇111111
□
[16:21:19.666]收←◆收到1收到1
[16:21:27.823]發(fā)→◇1111111
□
[16:21:27.874]收←◆收到1收到1
[16:21:30.942]發(fā)→◇11111111
□
[16:21:30.994]收←◆收到1收到1
[16:21:34.047]發(fā)→◇111111111
□
[16:21:34.118]收←◆收到1收到1收到
[16:21:37.287]發(fā)→◇1111111111
□
[16:21:37.359]收←◆收到1收到1收到
[16:21:41.686]發(fā)→◇11111111111
□
[16:21:41.717]收←◆收到1
[16:21:41.762]收←◆收到1收到
[16:21:44.391]發(fā)→◇111111111111
□
[16:21:44.463]收←◆收到1收到1收到1
作者:
廖振基
時間:
2022-1-9 16:29
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag, a, i;
uchar code table[]="收到";
void delayms(char i)
{
while(i--);
}
void init()
{
TMOD=0x20;
SCON=0x50;
PCON=0x80;
TH1=0xe6;
TL1=0xe6;
TR1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<4;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
復制代碼
作者:
IdeaMing
時間:
2022-1-10 09:43
a只能存一個字節(jié),所以回復a是1,沒錯啊。
你應該定義
unsigned char rx1buff[32];
unsigned char rx1cnt;
在接收中斷里
if(rx1cnt<32)
rx1buff[rx1cnt++]=SBUFF;
還一個就是,你收到一個字符a,就置位了標志位并關閉了串口接收,所以后面的也不能收到。
目前你的問題是屬于沒有理解串口數(shù)據(jù)的存儲。
如果改成我這樣,你可能發(fā)現(xiàn)結(jié)果還是一樣,因為你收到一個就結(jié)束了,發(fā)送收到的數(shù)據(jù)也只是SBUF=a;也只發(fā)送了一個數(shù)據(jù),而應該像你上面發(fā)送收到一樣是個循環(huán)把收到的數(shù)據(jù)全發(fā)出去。
那就是第二個問題,什么時候知道收完了呢?
1.加個末尾的識別字符
2.用定時器每次收到一個數(shù)據(jù)重新倒計時,如果倒計時結(jié)束了就認為一次數(shù)據(jù)接收完成,這個時候置位flag.
作者:
廖振基
時間:
2022-1-11 11:06
總之太多奇奇怪怪的問題了,本人先把這個掛起來以后用到的時候再來研究!。。!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1