OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2325|回复: 3

串口发送多个数据怎么分辨开?

[复制链接]

11

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-4-7
在线时间
29 小时
发表于 2018-5-31 09:55:44 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
               
                if(Uart1_RxOK==1){
                        return;
                }
                if(Res==';')
                        {
                        if(Uart1_RxCnt<50)
                                {
                                Uart1_RxBuf[Uart1_RxCnt]=0;
                          }
                        else
                                {
                                Uart1_RxBuf[49]=0;
                          }
                        Uart1_RxOK=1;
                  }
                else if(Uart1_RxCnt<50){
                        Uart1_RxBuf[Uart1_RxCnt++]=Res;
                }                    
     } [/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-4-7
在线时间
29 小时
 楼主| 发表于 2018-5-31 09:56:50 | 显示全部楼层
协议是这样的,我想往串口发送PID三个参数,但是不知道如何将他们区分开
回复

使用道具 举报

3

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1085
金钱
1085
注册时间
2015-5-22
在线时间
607 小时
发表于 2018-5-31 10:13:36 | 显示全部楼层
自己定义协议或者特定格式就可以。
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-5-31 10:18:22 | 显示全部楼层
[mw_shl_code=c,true]//接收数据标志位 各个位含义
//bit7:接收到尾    0xA5 0x5A  0 未收到  1 收到
//bit6:接收到头    0x55 0xAA  0 未收到  1 收到
//bit0-5:接收到数据个数      最多64个数据
unsigned  char rec_flag = 0;                    //接收数据标志位
unsigned  char rec_buf[10] = {0};               //接收数据存储

//串口接收数据格式为:  头1(0xA5) 头2(0x5A)  数据N位  尾1(0x55) 尾2(0xAA)
// 0xA5 0x5A xx xx xx xx xx xx xx xx xx xx xx  0x55 0xAA

__interrupt void UART1_Handle( void )
{
    unsigned char res = 0;
    if( rec_flag & 0x80 )                       //如果接收数据结束返回 数据被读取后才清0 标志位
    {
        return;
    }
    res = UART1_DR;
    UART1_SR &= ~( 1 << 5 );                    //RXNE 清零
    rec_flag++;                                 //接收数据计数
    //这种方式判断,可以有效识别类似 A5 A5 A5 5A XX XX 这样的数据开头
    //如果只判断第一位是A5,第二位是5A的话,上面的这种数据就判定为非法数据,不能有效识别
    if( ( res == 0xA5 ) && ( ( rec_flag & 0x40 ) == 0 ) )       //如果没有开始接收数据,并且当前的数据是0xA5 将计数清零
    {
        rec_flag = 0;                           //计数器清0
        return;
    }
    if( ( rec_flag & 0x3F ) == 0x01 )           //计数器等于1
    {
        if( res == 0x5A )                       //如果第二位数据是0x5A 说明已经正确收到了数据头
        {
            rec_flag |= ( 1 << 6 );             //接收到头第2位0x5A  置标志位
        }
        else
        {
            rec_flag = 0;                       //接收错误,重新开始
        }
        return;
    }
    if( ( ( rec_flag & 0x40 ) == 0x40 ) && ( ( rec_flag & 0x80 ) == 0 ) ) //已经成功接收到了头并且没有收到尾
    {
        //本次接收的是0xAA 上一笔数据是0x55 说明数据传输结束
        //这种方式可以有效识别 数据和结束符一样的情况如 XX XX XX 55 55 55 AA
        //如果接收到55就开始判断的话,上述的情况就会识别为非法数据,不能有效判断
        if( res == 0xAA )                                       //接收到尾 第2位
        {
            rec_buf[(rec_flag & 0x3F) -2] = res;
            if( rec_buf[( rec_flag & 0x3F) - 1 -2] == 0x55 )      //如果上次接收的数据是 尾第1位
            {
                rec_flag |= ( 1 << 7 );                         //接收数据结束
            }
        }
        else
        {
            rec_buf[(rec_flag & 0x3F) -2] = res;                     //存储接收到的数据
        }
    }
}[/mw_shl_code]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 20:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表