在程序的一部分:上位机发一个特定的指令,来查询设备地址
程序如下:
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检验的问题,或者其他,求指教
|