📄 modbus_rtu.c
字号:
//#include ".\STC89c5x.H"
#include".\Globle.h"
#include <macros.h>
#include".\Uart_Pv4.h"
#include".\Function.h"
#include<EEPROM.h>
uchar gvc_tmp;
uchar gvc_timer_flg;
uchar gvc_num_tmp;
uchar gvc_add_buff[20];
uchar gvc_send_buf[200];
uchar gvc_add_counter=0;
uchar gvc_satue;
uchar gvc_add_flg;
uchar gvc_addr;
unsigned char cy_receive_buf[UART_LEN];
unsigned char cy_uartnumber;
unsigned char gvc_data_num;
uchar cy_uartcomplete;//串口接受完一组数据
uchar * gvp_data_point;
uchar sy_10ms;
//unsigned int iy_wdata[WORD_NUM];//字存储区,可读可写
//sbit RTS_485=P3^5;
//sbit RUN_FLAG=P3^2;//运行状态指示灯
//-----------------------------------------------------------------------------
union crc //check crc 2 byte;
{
unsigned int word;
struct
{
unsigned char lo;
unsigned char hi;
}bytes;
};
union crc crc_chec;
void crc_chec_fuc(unsigned char datain)
{
unsigned char i;
crc_chec.bytes.lo=crc_chec.bytes.lo^datain;
for(i=0;i<8;i++)
{
if((crc_chec.word & 0x0001)==1)
{
crc_chec.word=crc_chec.word>>1;
crc_chec.word=crc_chec.word^0xa001;
}
else
crc_chec.word=crc_chec.word>>1;
}
}
void start_crc_chec(void)
{
unsigned char i;
crc_chec.word=0xffff;
for(i=0;i<(gvc_num_tmp-2);i++)
crc_chec_fuc(cy_receive_buf[i]);
}
void delay()
{
uchar i=255;
while(--i);
}
void generic_crc(unsigned char cyz_num)
{
unsigned char i;
crc_chec.word=0xffff;
for(i=0;i<cyz_num;i++)
crc_chec_fuc(gvc_send_buf[i]);
gvc_send_buf[cyz_num+1]=crc_chec.bytes.hi;
gvc_send_buf[cyz_num]=crc_chec.bytes.lo;
}
//发送一个字节
void uart_send(unsigned char s)
{
UDR1 = s;
while(!(UCSR1A & 0x40));
UCSR1A |=0x40;
}
//发送一帧数据
void frame_send(unsigned char t)//发送数据桢
{
unsigned char i;
for(i=0;i<t;i++)
uart_send(gvc_send_buf[i]);
}
//-----------------------------------------------------------------------------
void uart_run(void)
{
unsigned char x,y,x_num,y_num;
unsigned int cy_q,cy_s;
WordType lvi_add_tmp;
if(cy_uartcomplete)
{
DIR|=DIR_V;
cy_uartcomplete=0;
//uart_send(cy_receive_buf[0]);
start_crc_chec();
//uart_send(crc_chec.bytes.hi);
//uart_send(crc_chec.bytes.lo);
if((crc_chec.bytes.hi==cy_receive_buf[gvc_num_tmp-1])\
&&(crc_chec.bytes.lo==cy_receive_buf[gvc_num_tmp-2])) //crc
{
//uart_send(0x77);
switch(cy_receive_buf[1])
{
case 3://读寄存器
lvi_add_tmp.bytes.bh=cy_receive_buf[2];
lvi_add_tmp.bytes.bl=cy_receive_buf[3];
if((lvi_add_tmp.word<WORD_NUM)&&(cy_receive_buf[5]<WORD_NUM)&&((lvi_add_tmp.word+cy_receive_buf[5])<WORD_NUM))
{
gvc_send_buf[0]=cy_receive_buf[0];
gvc_send_buf[1]=cy_receive_buf[1];
gvc_send_buf[2]=cy_receive_buf[5]*2; //data number
gvc_data_num=3;
cy_q=lvi_add_tmp.word+cy_receive_buf[5]*2; //the end addr
gvp_data_point=&gvc_data_buf[0][0];
for(cy_s=lvi_add_tmp.word;cy_s<cy_q;cy_s++)
{
gvc_send_buf[gvc_data_num]=gvp_data_point[cy_s];
gvc_data_num++;
}
generic_crc(gvc_data_num);
gvc_data_num=gvc_data_num+2;
frame_send(gvc_data_num);//发送数据
}
break;
default:
break;
}
}
//
cy_uartnumber=0;
delay();
delay();
//PORTC&=~0x20;
// }
//SEI();
DIR&=~DIR_V;
}
}
void Add_analyse()
{
if(gvc_add_flg)
{
gvc_add_flg=0;
if(gvc_add_buff[1]==0x30&&gvc_add_buff[2]==0x30&&gvc_add_buff[3]==0x39
&&gvc_add_buff[4]==0x39)
gvc_addr=combination(ASC_HEX(gvc_add_buff[5]),ASC_HEX(gvc_add_buff[6]));
EEPROMwrite(SLAVER_ADDR,gvc_addr);
DIR|=DIR_V;
uart_send(gvc_addr);
DIR&=~DIR_V;
}
}
//-----------------------------------------------------------------------------
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
gvc_tmp=UDR1;
cy_receive_buf[cy_uartnumber]=gvc_tmp;
cy_uartnumber++;
if((cy_uartnumber>=128)||((cy_uartnumber==1)&&(cy_receive_buf[0]!=gvc_addr)))
cy_uartnumber=0;
TCNT2=0x16;
TCCR2=0x05;
//-------------------------------------------
if(gvc_tmp==':')
{
gvc_add_counter=0;
gvc_satue=1;
}
if(gvc_satue)
{
gvc_add_buff[gvc_add_counter]=gvc_tmp;
if(gvc_add_buff[gvc_add_counter]==0x0a&&gvc_add_buff[gvc_add_counter-1]==0x0d)
{
gvc_add_flg=1;
gvc_satue=0;
}
}
gvc_add_counter++;
if(gvc_add_counter>=20)
gvc_add_counter=0;
}
#pragma interrupt_handler timer2_ovf_isr:11
void timer2_ovf_isr(void)
{
//TCNT2 = 0xB2; //reload counter value
//TCNT2=0x16;
TCCR2=0x00;
gvc_num_tmp=cy_uartnumber;
cy_uartnumber=0;
cy_uartcomplete=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -