控制不应该是电脑串口发送个类似"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
}
|