打印
[AVR单片机]

ATMEGA8L基于ModbUS通讯协议

[复制链接]
1615|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlc824136|  楼主 | 2014-12-1 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在程序的一部分:上位机发一个特定的指令,来查询设备地址
程序如下:
uint crc16(uchar *puchMsg, uint usDataLen)
{
    uint uchCRCHi = 0xFF ; //* 高CRC字节初始化
    uint uchCRCLo = 0xFF ; //* 低CRC 字节初始化
    unsigned long int uIndex ; //* CRC循环中的索引
    while (usDataLen--) //* 传输消息缓冲区
    {
        uIndex = uchCRCHi ^ *puchMsg++ ; //* 计算CRC
        uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
        uchCRCLo = auchCRCLo[uIndex] ;
    }
    return (uchCRCHi << 8 | uchCRCLo) ;
}
void Uart_init(uint baud)    //串口初始化
{
  uint tkt;
  DDRD|=1<<PD1;
  DDRD|=1<<PD2;
  UCSRA=0X00;           //串口控制寄存器A清零
  UCSRB=0X00;           //串口控制寄存器B清零
  UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//对UCSEC寄存器操作,选择异步模式,数据位8位,无检验位,停止位1位
  UCSRC&=~(1<<URSEL);
  tkt=(mclk/16/baud)-1 ;   //波特率最大为65K
  UBRRH=((tkt>>8)&0x00ff);  //波特率寄存器高八位赋值
  UBRRL=(tkt&0x00ff);      //设置波特率  
  UCSRB|=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//打开接收,发送使能,打开接收中断使能
}
void Uart_send_byte(uchar a)//串口发送
{
  while(!UCSRA&(1<<UDRE));//等待数据寄存器空
  UDR=a;            //发送数据
  while(!UCSRA&(1<<TXC)); //等待发送结束
  UCSRA|=1<<TXC;       //清除发送结束标志位
}
void RS485_Respons(void)
{
  uint a,b;
  uint crc_data;
  if(Recive_Size==5)
   {
     if((Recive_Buff[0]==0x26)&&(Recive_Buff[1]==0x97)&&(Recive_Buff[2]=0x80))
   {
    a=Recive_Buff[4];
    b=Recive_Buff[3];
    b=(b<<8)|a;
    crc_data=crc16(Recive_Buff,3);
    if(crc_data==b)
     {
   RhWar//点亮LED,调试用
   Send_Buff[0]=0x26;
   Send_Buff[1]=0x97;
   Send_Buff[2]=0x80;
   Send_Buff[3]=Machine_Addr;
   crc_data=crc16(Send_Buff,4);
   Send_Buff[4]=crc_data>>8;
   Send_Buff[5]=(uchar)crc_data;
   RS485_L;//用模块,控制脚低电平,表示发送
   NOP();
   NOP();
   NOP();
   CLI();
   Uart_send_byte(Send_Buff[0]);
   Uart_send_byte(Send_Buff[1]);
   Uart_send_byte(Send_Buff[2]);
   Uart_send_byte(Send_Buff[3]);
   Uart_send_byte(Send_Buff[4]);
   Uart_send_byte(Send_Buff[5]);
   RS485_H;
   SEI();
  }
    else
     {}
   }
  else
   {}
   }
  else
   {}
现在LED会亮,可通讯软件就是没回应
是窜口发送函数的问题,还是CRC检验的问题,或者其他,求指教

相关帖子

沙发
wangch_sh| | 2014-12-1 17:28 | 只看该作者
先检查发送是否正常,再检查CRC校验,一步一步来。

使用特权

评论回复
板凳
yklstudent| | 2014-12-1 20:49 | 只看该作者
如果编译器用的是GCC,那么你的CRC校验程序有问题;
具体可以参考freemodbus下的CRC校验程序部分

使用特权

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

本版积分规则

24

主题

58

帖子

0

粉丝