3970|6

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430f149 modbus rtu 通信的问题 [复制链接]

新手求教msp430 modbus rtu通信的问题测试环境:
1)485芯片用的是max485,单片机用是TI的msp430F149.

问题:
请前辈帮看下代码,哪里有错误没?望前辈不吝赐教!谢谢
以下是代码:

#include  
#include  "cry1602.h"
#include "crc.h"
#define uint unsigned int
#define uchar unsigned char
#define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
#define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态
void Trans_val(uint m);
void Set_UART1(void);
uchar tishi[] = {"error:"};
uchar shuzi[] = {"0123456789."};
uchar sendbuf[]={0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x01};
uchar tem[5],tem1[8];
uchar resvbuf[9];
int i,j;
uchar resvend,temp2;
uint temp1,crc1,temp;
/****************主函数****************/
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
    LcdReset();  
    DRE_out;
    DE;
    Set_UART1();
    _EINT();
    i=0;
   while(1)
    {
      i=0;
   while(i<8)
  {
    TXBUF1=sendbuf;
   while(!(IFG2 & UTXIFG1));
    IFG2 &= ~UTXIFG1;
   i++;
  }
  i=0;
  RE;
    }
}
/****************液晶显示*************/
void displayout()
{
   crc1=crccheck(resvbuf,7);
   temp=resvbuf[8];
   temp=temp << 8 | resvbuf[7];
   if(temp==crc1)
   {   Disp1Char(13,1,0x43);  
       unsigned long m;
       temp1 |=resvbuf[3];
       temp1= temp1<<8 | resvbuf[4];
       m=(temp1/16)*16+temp1%16;
       Trans_val(m);
    }
  else
   {
     DispNChar( 0,0,10,tishi);
   }
}   

/*******************************************
函数名称:Set_UART1
功    能:设置MCU的UART1对应的寄存器
参    数:无
返回值  :无
********************************************/
void Set_UART1(void)
{
    P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
    ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
    UCTL1 |= CHAR;                            //选择8-bit字符
    UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
    UBR01 = 0x03;                             //波特率9600
    UBR11 = 0x00;
    UMCTL1 = 0x6B;                            //调整
    UCTL1 &= ~SWRST;                          //初始化UART状态机
    IE2 |= URXIE1;
}
/*******************************************
函数名称:接收中断函数
********************************************/
#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX (void)
{
  if (URXIFG1)  
{
    resvbuf[j++]=RXBUF1;  
       IFG2 &=~ URXIFG1 ;
   if(j==8)
   {
     j=0;
  resvend=1;
   }   
}
  
}
/***液晶显示子函数****/
void Trans_val(uint Hex_Val)
{
   uchar ptr[6];
    uint a;
    a =Hex_Val;
     ptr[0]=a/1000;    //百位
    ptr[1]=a/1000%10;    //百位
   
    ptr[2]=a/100%10;   //个位
     ptr[3]=10;  //十位
    ptr[4]=a/10%10;    //小数点后第一位
    ptr[5]=a%10;       //小数点后第二位
    for(i = 0;i <6;i++)
      Disp1Char((6 + i),1,shuzi[ptr]);
}

下面是crc校验的子程序
#include "msp430f149.h"
#include "crc.h"
uint crccheck(uchar *str, uint usDataLen)
{      
        uint i,j,c,crc;
        crc=0xff;
        for(i=0;i         {
          c=str&0xffff;
          crc^=c;
          for(j=0;j<8;j++)
          {
            if(crc&0x0001)
            {
              crc>>=1;
              crc^=0xa001;
            }
            else
              crc>>=1;
          }
}
        return (crc);
}




[ 本帖最后由 Domosday 于 2013-11-27 01:49 编辑 ]

温度传感器说明书.pdf

122.12 KB, 下载次数: 18

最新回复

ltbytyn 说得对,485是差分线方式传输,如果while(1)循环里边一直在运行 TXBUF1=sendbuf;    while(!(IFG2 & UTXIFG1));     IFG2 &= ~UTXIFG1; 这段程序,那么对方只能一直收而不能发出来了。 这跟232方式不一样,以前我也遇到过这个问题。后来解决思路是从机一直处于等待状态,收到主机发来的命令跟地址之后再返回数据。  详情 回复 发表于 2013-11-27 22:01
 
点赞 关注

回复
举报

2856

帖子

260

TA的资源

五彩晶圆(高级)

沙发
 
先不要管什么RTU。你的通信是有问题的。485收发不能同时进行。
格式: 发一帧——收一帧——发一帧如此循环的。

点评

您好!关于485通信那块儿我搞通了,做了一个定时发送。但是modbus tru 通信还是不对,每次的crc校验都是不通过,液晶一直显示的“error” 不知道自己的crc校验程序是不是有问题,如果不是还想请教是否是其他的地方  详情 回复 发表于 2013-12-2 17:41
谢谢您的回复,学习了!!!自己的学识尚浅啊~ :titter:  详情 回复 发表于 2013-11-27 17:20
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发ltbytyn 的帖子

谢谢您的回复,学习了!!!自己的学识尚浅啊~
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

4
 
ltbytyn 说得对,485是差分线方式传输,如果while(1)循环里边一直在运行
TXBUF1=sendbuf;
   while(!(IFG2 & UTXIFG1));
    IFG2 &= ~UTXIFG1;
这段程序,那么对方只能一直收而不能发出来了。
这跟232方式不一样,以前我也遇到过这个问题。后来解决思路是从机一直处于等待状态,收到主机发来的命令跟地址之后再返回数据。

点评

您好!关于485通信那块儿我搞通了,做了一个定时发送。但是modbus tru 通信还是不对,每次的crc校验都是不通过,液晶一直显示的“error” 不知道自己的crc校验程序是不是有问题,如果不是还想请教是否是其他的地方  详情 回复 发表于 2013-12-2 17:41
非常的感谢呢,自己后来看了看也意思到了是这部分的问题,自己先去再研究一下。如果再有问题的话,再向您请教!非常感谢~~~嘿嘿  详情 回复 发表于 2013-11-28 14:24
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼lonerzf 的帖子

非常的感谢呢,自己后来看了看也意思到了是这部分的问题,自己先去再研究一下。如果再有问题的话,再向您请教!非常感谢~~~嘿嘿
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼lonerzf 的帖子

您好!关于485通信那块儿我搞通了,做了一个定时发送。但是modbus tru 通信还是不对,每次的crc校验都是不通过,液晶一直显示的“error”  不知道自己的crc校验程序是不是有问题,如果不是还想请教是否是其他的地方的问题呢!
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 沙发ltbytyn 的帖子

您好!关于485通信那块儿我搞通了,做了一个定时发送。但是modbus tru 通信还是不对,每次的crc校验都是不通过,液晶一直显示的“error”  不知道自己的crc校验程序是不是有问题,如果不是还想请教是否是其他的地方的问题呢!
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表