標(biāo)題:
單片機(jī)串口接收數(shù)據(jù) 怎么接收一個(gè)判斷一個(gè)?
[打印本頁(yè)]
作者:
418854190
時(shí)間:
2021-11-25 21:07
標(biāo)題:
單片機(jī)串口接收數(shù)據(jù) 怎么接收一個(gè)判斷一個(gè)?
遙控接收部分 不想接收完整的數(shù)據(jù)后再判斷接收的數(shù)據(jù)是否正確 想接收一個(gè)判斷一個(gè) 接收判斷的部分怎么寫 要C語(yǔ)言的 我現(xiàn)在只能判斷第一個(gè) 往后就不會(huì)寫了 比如接收123456 1到5需要判斷 6存到Temp里
void UARTInterrupt(void) interrupt 4
{
if(RI)
{ RI=0;
Receive=SBUF;
if(Receive=='1')
{ Temp=Receive;
}
}
else
TI = 0;
}
作者:
188610329
時(shí)間:
2021-11-25 22:51
建議存緩存,然后統(tǒng)一判斷, 如果非要收一個(gè)判斷一個(gè)的話, 接收的時(shí)候啥事都干不了了。
接收時(shí)判斷如下:
void UARTInterrupt(void) interrupt 4
{
u8 i;
if(RI)
{
RI=0;
Receive=SBUF;
if(Receive=='1') //如果第一個(gè)字節(jié)吻合'1'
{
i = 255;
while((--i > 0) && (!RI));
if(RI)
{
RI=0;
Receive=SBUF;
if(Receive=='2') //如果第二個(gè)字節(jié)吻合'2'
{
i = 255;
while((--i > 0) && (!RI));
if(RI)
{
RI=0;
Receive=SBUF;
if(Receive=='3') //如果第三個(gè)字節(jié)吻合'3'
{
i = 255;
while((--i > 0) && (!RI));
if(RI)
{
RI=0;
Receive=SBUF;
if(Receive=='4') //如果第四個(gè)字節(jié)吻合'4'
{
i = 255;
while((--i > 0) && (!RI));
if(RI)
{
RI=0;
Receive=SBUF;
if(Receive=='5') //如果第五個(gè)字節(jié)吻合'5'
{
i = 255;
while((--i > 0) && (!RI));
if(RI)
{
RI=0;
My_Buf=SBUF; //保存第六個(gè)字節(jié)到緩存并返回
Recive_Ok = 1;
}
}
}
}
}
}
}
}
}
}
}
else
TI = 0;
}
再你代碼的基礎(chǔ)上寫的,i用來(lái)判斷超時(shí), i 的值取決于你的波特率,波特率越高i可以越小,反之i 可能需要增大。
最后,這種方法非常不建議。可能的話,還是推薦用緩沖池方式。
作者:
Y_G_G
時(shí)間:
2021-11-25 23:32
你這是紅外遙控還是串口,紅外遙控是在外部中斷的,那是要接收完整數(shù)據(jù)的
如果是串口通訊,可以在上位機(jī)或者遙控程序中加入起始信號(hào)和停止信號(hào)收到起始信號(hào)開始保存到數(shù)組中,收到結(jié)束信號(hào)之后開始判斷接收的信息,不需要每次都檢測(cè),那串口不累壞了
你參考一下:
void Uart1_Isr() interrupt 4 //串口1中斷函數(shù),這里要參考數(shù)據(jù)手冊(cè)來(lái)編寫代碼
{
char *p,Uart_S[20];
static unsigned char RX_Count=0x0;
if(TI) //如果是發(fā)送中斷觸發(fā),就處理發(fā)送中斷
{
TI=0; //發(fā)送中斷
busy=0;
}
if(RI)
{
RI=0; //清除中斷接收標(biāo)示位
Uart_S[RX_Count]=SBUF;
if(SBUF==0xff)end_str++; //檢測(cè)結(jié)束符
else if (end_str>0)end_str--;
if((Uart_S[RX_Count]==0xe8)&&(Uart_S[RX_Count-1]==0xc9)) //檢測(cè)開始接收到"設(shè)"字
{
RX_Count=1;
Uart_S[0]=0xc9;
Uart_S[1]=0xe8;
}
RX_Count++;
if(RX_Count>=20)RX_Count=0;//防止數(shù)組溢出
if(end_str>2)
{
p=strstr(Uart_S,"設(shè)開機(jī)"); //查找指令
if(NULL!=p)//如果接收到"設(shè)開機(jī)"字符串,指針返回值不為"空"
{
//處理部分
}
}
end_str=0;
RX_Count=0;
memset(&Uart_S,0,sizeof(Uart_S)); //串口接收數(shù)據(jù)歸零
}
}
}
作者:
xws245925587
時(shí)間:
2021-11-26 08:22
對(duì)于數(shù)據(jù)接收,建立一個(gè)環(huán)形緩存,在接收數(shù)據(jù)的時(shí)候,把數(shù)據(jù)push進(jìn)緩存中,在外部(while大循環(huán)中)一直檢測(cè)緩存是否有數(shù)據(jù),有數(shù)據(jù)則讀取出來(lái),類似生產(chǎn)者消費(fèi)者模式
作者:
npn
時(shí)間:
2021-11-26 08:55
建立一個(gè)unsigned char數(shù)組,然后進(jìn)行FIFO緩存。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1