|
控制不應(yīng)該是電腦串口發(fā)送個(gè)類(lèi)似"SET"的ASCLL碼,然后,單片機(jī)識(shí)別到"SET"就進(jìn)行設(shè)置這樣的操作嗎?
你發(fā)個(gè)A,定時(shí)器就是65,這好像一點(diǎn)關(guān)聯(lián)都沒(méi)有呀
單片機(jī)與串口通訊是要有協(xié)議的,串口很容易有干擾的我這有一段是單片機(jī)和串口屏之間的通訊協(xié)議,協(xié)議是我自己定的
以 # 為開(kāi)始,以3個(gè) 0xff為結(jié)束
只有符合這個(gè)格式的,才判定為有效的命令
在串口中斷中接收,在主函數(shù)中查找
數(shù)據(jù)的聲明和定時(shí)器設(shè)定你自己搞定,這里的代碼給你一個(gè)思路
void Uart1_Isr() interrupt 4 //串口1中斷函數(shù)
{
static u8 RX_Count = 0x00, end_str = 0x00; //RX_Count接收數(shù)據(jù)數(shù)量,end_str結(jié)束符數(shù)量
u8 temp;//
if(TI) //如果是發(fā)送中斷觸發(fā),就處理發(fā)送中斷
{
TI = CLR; //發(fā)送中斷
busy1 = CLR;
}
if(RI)
{
RI = CLR; //清除中斷接收標(biāo)示位
temp = SBUF; //讀取接收到的數(shù)據(jù)
Suart_re0.Uart_Re[RX_Count] = temp; //接收到的數(shù)據(jù)保存到緩沖池中
if(temp == 0xff)end_str++; //檢測(cè)結(jié)束符,接收到0xff就加1
else if (end_str > 0)end_str--; //否則減1
if(Suart_re0.Uart_Re[RX_Count] == '#')RX_Count = 0; //檢測(cè)開(kāi)始接收到"#",所有命令要以'#'開(kāi)頭,重新開(kāi)始接收
RX_Count++; //
if(RX_Count >= 30)RX_Count = 0; //防止數(shù)組溢出
if(end_str >= 3) //檢測(cè)接收到3個(gè)0xff結(jié)束符
{
end_str = 0;
RX_Count = 0;
Suart_re1 = Suart_re0; //接收到的數(shù)據(jù)轉(zhuǎn)移
memset(&Suart_re0, 0, sizeof(Suart_re0)); //原有串口接收數(shù)據(jù)清除
}
}
}
查找命令會(huì)用到strstr函數(shù)
char *p;
p = strstr(Suart_re1.Uart_Re,"#MODE_CH");//進(jìn)入充電模式
if(NULL != p)
{
指針?lè)祷刂挡皇强盏?就說(shuō)明有這個(gè) #MODE_CH
}
|
|