標題:
新手疑惑 關(guān)于C51單片機串口通訊的問題,挺急的在線等
[打印本頁]
作者:
2432606985
時間:
2018-7-31 23:08
標題:
新手疑惑 關(guān)于C51單片機串口通訊的問題,挺急的在線等
各位好,本人由于剛剛接觸51單片機,在學習串口通訊中遇到了困難,
{~}]@@8K`T7{0QJAWV]A8{8.png
(47.94 KB, 下載次數(shù): 56)
下載附件
2018-7-31 23:07 上傳
問題是:
由串口助手輸入字符串后,再返回到串口助手上的字符串卻有丟失,丟失的特點為,間隔丟失。
自己的理解:
函數(shù)中有比較函數(shù) strstr(),輸入ready后,可以繼續(xù)運行(led會滅)
所以rec數(shù)組所存的是輸入串口助手中的字符串,但顯示出來卻是“ray”,
應(yīng)該是send_str()函數(shù)有問題,但找不出原因。
請求老手指點!不勝感激!!
由于是新手,如果能夠解釋得清楚一些就更好了!
下面是我的源碼:
#include "reg52.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED=P2^0;
u8 rec_ct=0; //記錄接收數(shù)據(jù)的位數(shù)
u8 rec_flag=0; //接收完成標志
u8 rec[10]; //定義一個數(shù)組
void delay3s(void) //延時3s,誤差 0us
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=96;b>0;b--)
for(a=60;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay500ms(void) //延時0.5s,誤差 0us
{
unsigned char a,b,c;
for(c=205;c>0;c--)
for(b=116;b>0;b--)
for(a=9;a>0;a--);
}
void UsartInit() //串口初始化
{
SCON=0x50; //串口設(shè)置
TMOD=0X20; //T1計數(shù)器設(shè)置
PCON=0x80; //倍增打開
TH1=0xf3;
TL1=0xf3; //波特率設(shè)為4800;
EA=1; //IE設(shè)置
ES=1;
TR1=1; //開始計數(shù)
}
void send_str() //發(fā)送接收到的字符串
{
u8 i;
for(i=0;i<10;i++)
{
SBUF=rec[i];
while(!TI);
TI=0;
i++;
}
}
void Ustar() interrupt 4
{
if(RI==1)
{
RI=0;
rec[rec_ct]=SBUF; //接收串口數(shù)據(jù)
rec_ct++;
if(rec_ct==10) rec_ct=0; //防止溢出
rec_flag = 1;
}
}
void main()
{
u8 ct;
UsartInit();
start:
ct = 0;
while(1)
{
LED=0; //這個燈作為指示燈
delay3s(); //等待3S
if(rec_flag == 1) //串口接收到數(shù)據(jù)
{
rec_flag = 0;
send_str(); //發(fā)送接收到的字符串
if(strstr(rec, "ready")) //有沒有ready
{
P2 = 0xff; //接收到正確的回復(fù)就滅
delay500ms();
break;
}
}
ct ++;
if(ct>=3) goto start; //超過三次重新開始
}
while(1);
}
復(fù)制代碼
作者:
多德
時間:
2018-7-31 23:08
你的send_str函數(shù)里面已經(jīng)在for循環(huán)里將i++了,然后你TI = 0;后依然i++。檢查一下。
void send_str(void) //發(fā)送接收到的字符串
{
u8 i;
for(i=0; i<10; i++)
{
TI = 0;
SBUF=rec[i];
while(!TI);
TI = 0;
}
}
作者:
guangshi_wq
時間:
2018-8-1 01:21
把發(fā)送也要寫到中斷里,不能這樣寫
作者:
guangshi_wq
時間:
2018-8-1 01:22
象這樣寫.
void intSIO() interrupt 4 using 2
{
if(TI){
TI=OFF;
if(bSD){
if(curSND<lenSND) SBUF=bufSND[curSND++];
else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
RI=OFF;
bufRCV[putRCV++]=SBUF;
putRCV &= 0X07;}
}
作者:
2432606985
時間:
2018-8-1 07:38
那請問將發(fā)送寫入中斷后,如何觸發(fā)TI=1的條件呢?如果不能觸發(fā)TI=1就不能將數(shù)據(jù)寫入SBUF,而數(shù)據(jù)沒有寫入SBUF,就無法觸發(fā)TI=1的條件,這是個死循環(huán)啊。。。。。。 我的理解是這樣的
作者:
fht@51hei
時間:
2018-8-1 09:39
void intSIO() interrupt 4 using 2
{
if(TI)
{
TI=OFF;
if(bSD)
{
if(curSND<lenSND) SBUF=bufSND[curSND++];
else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
RI=OFF;
bufRCV[putRCV++]=SBUF;
putRCV &= 0X07;}
}
作者:
2432606985
時間:
2018-8-2 08:21
謝謝各位前輩給我的建議和熱心的解答!但是我的問題是為什么會出現(xiàn)這樣的情況以及解決方法,最佳答案只能給解決了這兩個問題的人哈。大家對我編程的建議我都應(yīng)用在后續(xù)程序中了,使得邏輯更加清晰了,非常感謝!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1