51单片机如何对接收的字符串进行判断? 20

下面的程序是单片机接收PC发过来以s开头的字符串,然后返回PC串口上的,我想改成如果接收到如:s000后,led1=1,接收到s001后led1=0.//串口接收以特定字... 下面的程序是单片机接收PC发过来以s开头的字符串,然后返回PC串口上的,我想改成如果接收到如:s000后,led1=1,接收到s001后led1=0.

//串口接收以特定字符为开头的字符串并且保存特定字符之后的有效位
#include<reg52.h>
#define uint unsigned char
#define uchar unsigned int
uchar ser_receive; //串口接收到的数据
uchar ser_flag=0;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
uchar receive_number[3]={0};//接收串口发送来的数据的数组
uchar i=0;
uchar j;
uchar come=0;
void init_ser()
{

TMOD=0X20;//定时器1工作在方式2
TH1=0XFD;
TL1=0XFD; //波特率9600
TR1=1;
EA=1;
SM0=0;
SM1=1;
REN=1;//允许串口接收
ES=1;//开串口 中断

}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);

}
/****************************************************************************************
* 程序目的:串口接收字符串,但是要以字符s为开头的后面的11位字符,若开头不为s则接收不写入数组
* 若开头为a 但是发送有效位超过3位 就把后面的截断 只要前11位
****************************************************************************************/
void ser() interrupt 4 //中断函数不用声明
{
if(RI==1)
{
RI=0;
ser_receive=SBUF;

if(come==1)
{
if(ser_receive!='\0'&&ser_receive!='s')
{
receive_number[i]=ser_receive;
i++;
if(i==3)
{
i=0;
ser_flag=1;
come=0;
}

}
}

else if(ser_receive=='s')
{
come=1;
}

}

}

void main()
{
init_ser();
while(1)
{
if(ser_flag==1)
{
ES=0;
ser_flag=0;
for(j=0;j<3;j++)
{
SBUF=receive_number[j];
while(!TI);
TI=0;
delay(10);
}
ES=1;
}
}
}
展开
 我来答
神木雕像
2014-05-04 · TA获得超过413个赞
知道答主
回答量:59
采纳率:100%
帮助的人:72.8万
展开全部
对从s开始直到下一个s(如果有的话,没有则设置命令超时)为止的字符串求CRC,然后switch case
一直都是这么做,串口中断只管接收,不必分析数据格式,如果串格式定长,那更好办了。。。
追问
能不能把程序改改看看呢,没太明白意思!
追答
得等到我晚上回家。。。才有时间
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式