📄 main.c
字号:
*
*********************************************************************************************************
*/
void SerialInterrupt(void) interrupt 4 using 2
{
DisableInterrupt();
if (TI)
{
TI = 0;
int_232=1; //232成功发送一字节,置232发送完成标志
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
if (RI)
{
RI = 0;
rx_232=1; //232成功接收一字节,置232接收完成标志
}
EnalbeInterrupt();
}
/*********************************************************************************************************
*
* 函数名称:Seria2Interrupt
*
* 输入变量:无
*
* 输出变量:无
*
* 功能描述:串口中断1函数(中断号为 8,使用寄存器 1)
*
*********************************************************************************************************
*/
void Seria2Interrupt(void) interrupt 15 using 2
{
DisableInterrupt();
if (TI_1)
{
TI_1 = 0;
int_485=1;//485成功发送一字节,置232发送完成标志
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
if (RI_1)
{
RI_1 = 0;
rx_485=1;//485成功接收一字节,置232接收完成标志
}
EnalbeInterrupt();
}
/*
*********************************************************************************************************
*
* 函数名称:Sendto485
*
* 输入变量:要发送的数据
*
* 输出变量:无
*
* 功能描述:把接收到的数据发送到485
*
*********************************************************************************************************
*/
void Sendto485(unsigned char *data485)
{
send_485 = data485;//存将要发送数据的首地址
length_485 = 12; //设置发送数据长度
SBUF1 = *send_485; //发送数据到485
}
/*
*********************************************************************************************************
*
* 函数名称:Sendto232
*
* 输入变量:要发送的数据
*
* 输出变量:无
*
* 功能描述:把接收到的数据发送到232
*
*********************************************************************************************************
*/
void Sendto232(unsigned char *data232)
{
send_232=data232;//存将要发送数据的首地址
length_232=12;//设置发送数据长度
SBUF=*send_232;//发送数据到232
}
/*
*********************************************************************************************************
*
* 函数名称:Changetoadr
*
* 输入变量:无
*
* 输出变量:无
*
* 功能描述:把CAN接收到的ID转换成232,485的地址
*
*********************************************************************************************************
*/
void Changetoadr(void)
{
unsigned char i,temp[4];
for(i=0;i<4;i++)
temp[i]=TCandata[i+1];
TCandata[1] = temp[0]>>3;
TCandata[2] = (temp[0]<<5 | temp[1]>>3);
TCandata[3] = (temp[1]<<5 | temp[2]>>3);
TCandata[4] = (temp[2]<<5 | temp[3]>>3);
}
/*
*********************************************************************************************************
*
* 函数名称:main
*
* 输入变量:无
*
* 输出变量:无
*
* 功能描述:主循环函数,通常是一个无限循环
*
*********************************************************************************************************
*/
void main(void)
{
unsigned char i;
DisableInterrupt();
AUXR = 0x00;
CpuInit();
SjaInit();
EnalbeInterrupt();
AUXR = 0x01;
ucCircle = 0;
bSjaReceived = FALSE;
int_flag_232 = 1;
int_flag_485 = 1;
int_232=0;
int_485=0;
rx_232=0;
rx_232=0;
rx_flag_232 = 0;
rx_flag_485 = 0;
length_485 = 0;
length_232 = 0;
Control485=0;
LED=0;
while (1)
{
LED^=1; //喂狗
/////////////////////////////从232接收,发送到can,485///////////////////////////////////
if (rx_flag_232 == 1 || RCount_232 > TCount_232) //232接收完成或还存在没发送出去的数据
{
if(int_flag_485) //一帧完整的数据通过485发送完了吗?
{
Control485 = 1; //485为发送模式;
for(i=0;i<13;i++)
TCandata[i]=rec_232_R[BagCount_T_232][i]; //把存在外RAM的232数据调到内RAM,供CAN,485发送用
SjaSend(TCandata); //继续发送232已经接收到的数据到CAN
Sendto485(TCandata);//继续发送232已经接收到的数据到485
TCount_232++; //累计发送次数
BagCount_T_232++; //成功发送了前一232的数据,数据指针加一,开始发送没发送出去的数据
if(BagCount_T_232>BadLenght) //计数已到最大值,重新开始从第一位读取接收回来的232数据
BagCount_T_232=0;
int_flag_485=0; //清484接收完成标志
}
rx_flag_232 = 0; //清232接收完成标志
}
else
{
TCount_232 = 0;
RCount_232 = 0;
}
///232成功发送一字节数据//
if(int_232)
{
if((length_232--)>0)
{
send_232++; //发送指针指向下一要发送数据的地址
SBUF=*send_232; //发送
}
else
{
int_flag_232=1;//一帧数据发送完成
}
int_232=0;
}
///232成功接收一字节数据//
if(rx_232)
{
TR0=1; //开定时器0,(10MS后如果还没接收完13位数据就把之前接收的舍去)
rec_232_R[BagCount_R_232][length_232_R] = SBUF; //接收数据到232数据缓冲区
length_232_R++; //232接收个数加1
if(length_232_R == 13) //接收完13个数据?(数据包括:4位ID, 1位的CAN数据长度,8位的CAN数据)
{
TR0=0; //关定时器0,已经接收到13位数据了
TH0 = 0Xdc; //10MS定时赋初值
TL0 = 0X00;
rx_flag_232 = 1; //成功接收,,置232成功接收标志,可以对CAN ,485发送了
length_232_R = 0; //232接收个数计数清0;
RCount_232++;
BagCount_R_232++; //数据包计数加1
if(BagCount_R_232>BadLenght) //232接收缓冲区已满,调回到第一个区继续接收;
BagCount_R_232=0;
}
rx_232=0;
}
//////////////////////////////从485接收,发送到can,232///////////////////////////////////
if (rx_flag_485 == 1 || RCount_485 > TCount_485 ) //485接收完成或485成功接收回来的数据都发送出去了吗?
{
if(int_flag_232) //一帧完整的数据通过232发送完了吗?
{
for(i=0;i<13;i++)
TCandata[i]=rec_485_R[BagCount_T_485][i];
SjaSend(TCandata); //继续发送485已经接收到的数据到CAN
Sendto232(TCandata);//继续发送485已经接收到的数据到232
TCount_485++;
BagCount_T_485++; //成功发送了前一485的数据,数据指针加一,开始发送没发送出去的数据
if(BagCount_T_485>BadLenght)
BagCount_T_485=0;
int_flag_232=0; //清232接收完成标志
}
rx_flag_485 = 0; //清485接收完成标志
}
else
{
TCount_485 = 0;
RCount_485 = 0;
}
///485成功发送一帧数据//
if(int_485)
{
if((length_485--)>0)
{
send_485++; //发送指针指向下一要发送数据的地址
SBUF1 = *send_485; //发送
}
else
{
int_flag_485 = 1;//发送完成,允许发送新数据
Control485 = 0; //485已经把数据发送完毕,把模式转为接收;
length_485_R = 0;
}
int_485=0;
}
///485成功接收一字节数据//
if(rx_485)
{
TR0=1; //开定时器0,(10MS后如果还没接收完13位数据就把之前接收的舍去)
rec_485_R[BagCount_R_485][length_485_R] = SBUF1; //接收数据到485数据缓冲区
length_485_R++; //485接收个数加1
if(length_485_R == 13) //接收完13个数据?(数据包括4位ID, 1位的CAN数据长度,8位的CAN数据)
{
TR0=0; //关定时器0,已经接收到13位数据了
TH0 = 0Xdc; //10MS定时赋初值
TL0 = 0X00;
rx_flag_485 = 1; //成功接收,可以发送了,置485成功接收标志
length_485_R = 0; //485字节接收数清0;
RCount_485++; //485帧计数加1;
BagCount_R_485++; //数据包计数加1
if(BagCount_R_485>BadLenght) //485接收缓冲区已满,调回到第一个区继续接收;
BagCount_R_485=0;
}
rx_485=0;
}
///////////////////从can接收,发送到485,232////////////////////////
if (bSjaReceived ||RCount_CAN > TCount_CAN )
{
if(int_flag_232&&int_flag_485) //485,232把一帧完整的数据发送完成了吗?
{
Control485 = 1; //485为发送模式;
for(i=0;i<13;i++) //外RAM的CAN数据调到内RAM
TCandata[i]=Candata_R[Bagcount_T_CAN][i];
Changetoadr(); //把CAN接收的地址转换为232,485能识别的地址
Sendto232(TCandata); //发送数据到232
Sendto485(TCandata); //发送数据到485
TCount_CAN++; //CAN发送次数加1
Bagcount_T_CAN++; //CAN发送指针加1
if(Bagcount_T_CAN>BadLenght_can) //CAN发送指针溢出
Bagcount_T_CAN=0; //重置CAN发送指针
int_flag_232=0; //清232发送完成标志
int_flag_485=0; //清485发送完成标志
}
bSjaReceived=0;
}
else
{
RCount_CAN=0;
TCount_CAN=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -