打印

请教串口:第一字节是0XFF,最后一个是0XOO,

[复制链接]
4864|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abcdefg__123|  楼主 | 2009-6-23 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xwj| | 2009-6-23 11:47 | 只看该作者

既然确定“中间数据没有0XFF,0X00”,每收一个字节都判断它

使用特权

评论回复
板凳
mohanwei| | 2009-6-23 12:01 | 只看该作者

任何通信,接收过程都要注意判断缓冲区长度

以下是我常用的方式:(去掉了帧头帧尾转义队列等不想关的东西……)
void Push_COM1(uchar ch)
{
    if(COM1.FrameLen>_MAX_BuffLen)//缓冲区溢出
    {
        COM1.FrameLen=0;//缓冲区清零
    }

    if(ch==0xFF)//收到帧头,清空缓冲区
    {
        COM1.Frame=0;//帧计数器清零
        COM1.FrameLen=0;
    }
    else if(ch==0x00)//收到帧尾
    {
        COM1.Frame++;//帧计数器加1(主程序里根据这个变量判断接收缓冲区是否有帧)
    }
    else
    {
        COM1.Buff[COM1.FrameLen++]=ch;//普通字节,直接保存
    }
}

void uar1_interrupt(void)    interrupt UART1_VECTOR
{
    if(RI1)
    {
        RI1=0;
        Push_COM1(SBUF1);//
    }
    ……
}

使用特权

评论回复
地板
扬欣电子| | 2009-6-23 12:03 | 只看该作者

怎样接收,才能不出错呢?

不太明白你的问题,是不是想问:怎样接收,才能不遗漏呢?

    开串口中断,判别收到的是不是0XFF,若是就说明数据段来了;开始接收后面的数据,若不是就不执行接收。
    每收一个字节就保存,并判别是不是0XOO;
    若不是就继续接收;若是就说明数据段结束了,停止继续接收。 

使用特权

评论回复
5
abcdefg__123|  楼主 | 2009-6-23 14:08 | 只看该作者

谢谢啊。

因为通讯比较频繁,所以不能快速准确的接收,就容易出错。
一旦接收不正确,而下一个通讯数据又来的话,这样整个通讯过程还的重新开始。
每一次通讯,需要发几个命令,而且每次应答都的处理。

使用特权

评论回复
6
abcdefg__123|  楼主 | 2009-6-23 14:14 | 只看该作者

谢谢三位。接收的长度不定。有的三个,最长十几个。

使用特权

评论回复
7
red1986| | 2009-6-29 15:10 | 只看该作者

接收0XFF

接收0XFF,接收到0XFF后在等待0X00,在规定的一段时间内没收到0X00则重新接收0XFF,这样循环不就行了吗

使用特权

评论回复
8
naren| | 2009-7-3 13:44 | 只看该作者

按状态接收

分空闲、接收0xff,接收有效数据、接收0x00几种状态,再配合接收超时处理。只有接收到有效数据时才保存数据,并判定数据长度是否溢出。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝