串口接收问题,新手请教!

炼气士 2011-06-10 09:39:29
功能是串口收到上位机发的01 02命令帧后,单片机返回01 02;
如果上位机先发个01,然后过会儿再发02,则不做操作。
弱弱的问一下单片机如何区分。
...全文
66 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjtea 2011-06-10
  • 打赏
  • 举报
回复
先明确一下:
通常所说的命令帧应该有一串多个连续的字节,所以就很容易判定是否是规定的命令帧,如果是,就可以立即做出反应,返回规定的字节内容。
独立送来的01或02,不符合命令帧的标示或验证不通过,也就没有反应了。

如果就是要区分连续送来“01,02”,与断续送来的“01”和“02”,也没有问题。区分的做法就是,收到“01”之后立即启动计时,时间很短收到“02”就回复;如果时间较长后收到02,就不回复。
dceacho 2011-06-10
  • 打赏
  • 举报
回复

void Timer0(void) interrupt x
{
if(sercnt<0xfff0)sercnt++;
}

dceacho 2011-06-10
  • 打赏
  • 举报
回复
哦,不好意思看错了,应该这样
全局uint sercnt;

void serint(void) interrupt x
{
uchar i;
for(i=0;i<6;i++)serbuf[i+1]=serbuf[i];//移动数组
serbuf[0]=SBUF;
if(serbuf[0]==0x01)sercnt=0;
if(serbuf[1]==0x01)
{
if(serbuf[0]==0x02)&&(sercnt<指定时间)
{
//任务标记,只做标记,在主循环中查询该标记然后执行响应
}
}
}

void Timer0(void) interrupt x
{
sercnt++;
}
dceacho 2011-06-10
  • 打赏
  • 举报
回复
需要一个全局数组,例如uchar serbuf[8]
思路是这样的

在串口中断里

void serint(void) interrupt x
{
uchar i;
for(i=0;i<6;i++)serbuf[i+1]=serbuf[i];//移动数组
serbuf[0]=SBUF;
if(serbuf[1]==0x01)
{
if(serbuf[0]==0x02)
{
//任务标记,只做标记,在主循环中查询该标记然后执行响应
}
}
}

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧