51单片机串口接收不定长数据

2020-01-13 18:37发布

请教大神,单片机串口如何接收不定长数据啊 ,比如 0x01+0x03+len+data0....datan CRC_H  CRC_L 写了一下午没啥成果
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
31条回答
1328616904
1楼-- · 2020-01-16 14:35
czzhouyun 发表于 2015-12-23 12:03
间隔20ms那是超时处理,这个显然是modbus协议,只要在读取字长字节时改变整个命令的长度就可以了,光处理超 ...

对,我根据需要接受命令的长度,控制串口的接收计数器和延时处理,这样既能保证数据的准确性又可以方式死机
mailyyg@163.com
2楼-- · 2020-01-16 15:48
 精彩回答 2  元偷偷看……
chen849928055
3楼-- · 2020-01-16 16:47
楼主可以把这个程序发上来学习下吗?
1328616904
4楼-- · 2020-01-16 22:36
mailyyg@163.com 发表于 2015-12-23 13:57
设置定时器,串口接收中断重置定时器,定时器溢出中断设置标志位,判断标志位,处理 ...

差不多吧
ypc168k
5楼-- · 2020-01-17 00:02
最近也在写串口不定长接收,学习了。谢谢楼主
hongguan
6楼-- · 2020-01-17 05:40
void ComInINT(void) interrupt 4 //using 1  //串口接收-中断函数
{   
        uchar xdata comm_dat[65];  //串口接收
        uchar dat,i;
       
    if(RI)
    {
        RI=0;
        dat=SBUF;
                                switch (step)
                                {
                                        case 1:
                                        {
                                                Count=0;
                                                if(dat=='/')step=2;
                                                else step=1;
                                        }
                                        break;

                                        case 2:
                                        {
                                                comm_dat[Count]=dat;
                                                if(comm_dat[Count]==0x0d)step=3;
                                                else step=2; Count++;                                         
                                                if(Count>64){Count=0;step=2;}
                                        }
                                        break;
                                        case 3:
                                        {                                                                               
                                                    for(i=0;i<Count;i++)chs[i]=comm_dat[i];
                                                    for(i=0;i<64;i++)comm_dat[i]=0;
                                                read_flag=1; step=0; dat=0;
                                        }
                                        break;
                                       
                                        default:{}break;
                                }                                                               
    }
    if(TI)
                        {TI = 0;busy = 0;}
}

一周热门 更多>