OpenEdv-开源电子网

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

RS485简单的数据通信协议,接收端显示不正确

[复制链接]

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2014-1-7
在线时间
42 小时
发表于 2014-8-28 16:43:46 | 显示全部楼层 |阅读模式
5金钱
       我有两个板子A,B。我想做的东西是,A板实时采集环境温度并显示温度值,同时A板将采集到的温度数据通过RS485传送到B板,B板将接从A板接收到的温度数据也在液晶上显示出来
      我自己写了一个简单的单向的485传输协议,我将A板通过USB转485工具和电脑相连,电脑上打开串口助手,可以采集到当前的温度数据,数据是正确的。比如:温度为0的时候,串口收到的数据是:24 30 30 30 90 23。
      现在的问题是B板子上接收到的温度数据不对,数据无法自动更新。但是经我调试看,接收端可以进入中断函数的(我在中中断里放了一个LED,一发数据进入中断接收就会亮一下)。我接收程序写得不好,就是不知道怎么写。大家帮帮我呀!




               
/*******************************************************************************************************************
                                 sum();求和函数
取温度值得十位,个位和小数位上的数据之和,作为校验字节返回

********************************************************************************************************************/
unsigned char sum(unsigned char *dat,unsigned char n)
{
 unsigned char i;
 unsigned char s_dat=0x00;
 for(i=1;i<n+1;i++)
 {
      s_dat+=dat;
    }

    return(s_dat);
}


          发送部分:


if(mode==2)//模式2界面

LCD12864_Display_Words(0, 2, "RS485");
LCD12864_Display_Words(0, 5, "模式");
LCD12864_Display_Words(1,0,"从机1:");
/***********************************************以下为自定义通讯协议***************************************************************/

Temperature =(sDevSystemPara.afAI_InputLast[0]/0.306)*100;//对pt100电流值进行处理转化为温度值,*10保留一位小数
temp = Temperature;//读取温度

aucRxBuff_UART4[0]=0x24;                //发送协议起始标志$
aucRxBuff_UART4[1]=temp%1000/100;       //存十位上的数据
aucRxBuff_UART4[2]=temp%100/10;         //存个位上的数据
aucRxBuff_UART4[3]=temp%10;             //存小数位上的数据
aucRxBuff_UART4[4]=sum(aucRxBuff_UART4,3);//存校验和
aucRxBuff_UART4[5]=0x23;                //发送协议结束标志位

UART4_SendData(aucRxBuff_UART4,6); //从机向主句发送温度数据

OSTimeDlyHMSM(0,0,0,1000);        //延时1秒
    }




接收部分:

if(mode==2)

LCD12864_Display_Words(0, 2, "RS485");
LCD12864_Display_Words(0, 5, "模式");
LCD12864_Display_Words(1,0,"从机1:");

                               //以下为接收部分代码
 if(ucRx4_RcvReady == 1)//接收完成,数据均缓存到aucRxBuff_UART4[]里
{   
 
 if(aucRxBuff_UART4[0]!=0x24)//判断头是不是起始标志0x24
   {
             uiRx4_DataLen=0;
            }
if(uiRx4_DataLen>6)//若接收字节大于6
   { 
      uiRx4_DataLen=0;
      sum_reslut=0;
      sum_reslut=sum(aucRxBuff_UART4,3);//和校验求和 
      if(sum_reslut==aucRxBuff_UART4[4])//校验和对则对接收的数据进行显示
        {  
   LCD12864_Write(0xf8,0x98);
   LCD12864_Write(0xfa,(aucRxBuff_UART4[1]+0x30));
   LCD12864_Write(0xfa,(aucRxBuff_UART4[2]+0x30));
   LCD12864_Write(0xfa,'.');
   LCD12864_Write(0xfa,(aucRxBuff_UART4[3]+0x30));

                                          }
                                       OSTimeDlyHMSM(0,0,0,1000);
            }

}




接收中断部分:

void UART4_IRQHandler(void)
{
u8 c;
static u8 flag = 0;
static u8 uiRx4_DataLen_Temp = 0;
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
   USART_ClearITPendingBit( UART4, USART_IT_RXNE); //清除中断位
            c=UART4->DR;
           if((c=='$')|(flag==1))
    {   
flag=1; 
   
aucRxBuff_UART4[uiRx4_DataLen_Temp] = c;
uiRx4_DataLen_Temp++;
       if(c == '#')
{   

  ucRx4_RcvReady = 1;//置位一个接收完成标志?
uiRx4_DataLen = uiRx4_DataLen_Temp;//外部获取接收长度
  flag = 0;

}
    }
          else 
    { flag=0;
      uiRx4_DataLen_Temp = 0;
     }
//aucRxBuff_UART4[uiRx4_DataLen] = c;
//uiRx4_DataLen++;
}
//处理IDLE中断
//当产生IDLE中断时,表示接收完毕一组完整的数据
else if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET)
{
//这个语句加上上面的判断语句结合起来才能清除IDLE中断
   c = UART4->DR;

//
//此时UART4数据接收完毕。
//用户可以处理数据。最好在主程序中处理,而不是在中断程序中处理。
//
  ucRx4_RcvReady = 1;
}
}










协议代码.txt

3.76 KB, 下载次数: 153

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

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2014-1-7
在线时间
42 小时
 楼主| 发表于 2014-8-28 16:50:05 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-28 23:14:22 | 显示全部楼层
你用电脑发送数据给单片机,试试能否正常吧.
你的测试,只验证了单片机发,电脑收.
没验证电脑发,单片机收.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2014-1-7
在线时间
42 小时
 楼主| 发表于 2014-8-29 08:51:57 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
已经验证了,电脑发,单片机收。可能是我没说明白,现在就是单片机收到啥数据都显示00.0 而且只能收一次无法更新呀
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-29 23:43:01 | 显示全部楼层
回复【4楼】ALIEN_WALI:
---------------------------------
仿真下看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 03:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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