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