📄 232tocan.c
字号:
}
else if (strcmp(Command,"can+500k") == 0)
{
CanBaud = 2;
Write_byte(2, CanBaud);
Send_ok();
}
//命令出错
else
{
Send_stream("Command error!");
Send_end();
}
}
//can工作模式0
else if (strcmp(Command,"basiccan") == 0)
{
Can_mode = 0;
Write_byte(3, Can_mode);
Send_ok();
}
//can工作模式1
else if (strcmp(Command,"pelican") == 0)
{
Can_mode = 1;
Write_byte(3, Can_mode);
Send_ok();
}
//验收码
else if (strncmp(Command,"code+",5) == 0)
{
//4位十六进制数
if (Recjs - 5 == 4)
{
t_b = 0;
for (t_a = 5; t_a < Recjs; t_a++)
{
//是否都为十六进制数
if (!isxdigit(Command[t_a]))
{
t_b = 1;
break;
}
//转换成16进制数
else
{
Command[t_a] = toint(Command[t_a]);
}
}
//正确
if (t_b == 0)
{
crc = Command[5] * 4096 + Command[6] * 256 + Command[7] * 16 + Command[8];
Acr_data = crc;
Write_int(4, Acr_data);
Send_ok();
}
else
{
Send_stream("Command error!");
Send_end();
}
}
else
{
Send_stream("Command error!");
Send_end();
}
}
//屏蔽码
else if (strncmp(Command,"mask+",5) == 0)
{
//4位十六进制数
if (Recjs - 5 == 4)
{
t_b = 0;
for (t_a = 5; t_a < Recjs; t_a++)
{
//是否都为十六进制数
if (!isxdigit(Command[t_a]))
{
t_b = 1;
break;
}
//转换成16进制数
else
{
Command[t_a] = toint(Command[t_a]);
}
}
//正确
if (t_b == 0)
{
crc = Command[5] * 4096 + Command[6] * 256 + Command[7] * 16 + Command[8];
Amr_data = crc;
Write_int(6, Amr_data);
Send_ok();
}
else
{
Send_stream("Command error!");
Send_end();
}
}
else
{
Send_stream("Command error!");
Send_end();
}
}
//返回出厂值
else if (strcmp(Command,"return") == 0)
{
Cs_init();
Baudrate(ComBaud);
Send_ok();
}
//退出
else if (strcmp(Command,"quit") == 0)
{
Send_ok();
return 1;
}
//命令出错
else
{
Send_stream("Command error!");
Send_end();
}
}
return 0;
}
//通讯参数进行配置
void Debug_config(void)
{
uchar t_c;
uchar debug;
ES = 0;
debug = 0;
//等待5秒钟
Wait_timer = TIMER5s;
while (Wait_timer > 0)
{
//点亮指示灯
REC_LED = 0;
SEND_LED = 0;
Dog();
if (_testbit_(RI) && Recjs < CMD_LENGHT)
{
t_c = SBUF;
Command[Recjs] = t_c;
//是否有换行符
if (t_c == ASCII_LF && Recjs > 0)
{
//前面一个字符是否为回车符
if (Command[Recjs - 1] == ASCII_ENTER)
{
//进入调试模式
debug = 1;
Recjs = 0;
break;
}
}
Recjs++;
}
}
//调试模式
if (debug == 1)
{
Send_stream("FANLO Tech. Co., Ltd.");
Send_end();
Send_stream("RS232/CAN Version ");
Command[0] = Ver_a + 48;
Command[1] = '\0';
Send_stream(Command);
Send_stream(".");
Command[0] = Ver_b + 48;
Command[1] = '\0';
Send_stream(Command);
Command[0] = Ver_c + 48;
Command[1] = '\0';
Send_stream(Command);
Send_end();
switch (ComBaud)
{
case 0:
Send_stream("Com,1200bps,None,1,8,1");
break;
case 1:
Send_stream("Com,2400bps,None,1,8,1");
break;
case 2:
Send_stream("Com,4800bps,None,1,8,1");
break;
case 3:
Send_stream("Com,9600bps,None,1,8,1");
break;
case 4:
Send_stream("Com,19200bps,None,1,8,1");
break;
case 5:
Send_stream("Com,38400bps,None,1,8,1");
break;
case 6:
Send_stream("Com,57600bps,None,1,8,1");
break;
case 7:
Send_stream("Com,115200bps,None,1,8,1");
break;
}
Send_end();
switch (Rec_delay)
{
case 1:
Send_stream("Com,Receive,Delay,50ms");
break;
case 2:
Send_stream("Com,Receive,Delay,100ms");
break;
case 4:
Send_stream("Com,Receive,Delay,200ms");
break;
case 10:
Send_stream("Com,Receive,Delay,500ms");
break;
case 20:
Send_stream("Com,Receive,Delay,1s");
break;
case 40:
Send_stream("Com,Receive,Delay,2s");
break;
case 100:
Send_stream("Com,Receive,Delay,5s");
break;
case 200:
Send_stream("Com,Receive,Delay,10s");
break;
}
Send_end();
if (Can_mode == 0)
{
Send_stream("BasicCAN Mode");
}
else
{
Send_stream("PeliCAN Mode");
}
Send_end();
if (CanBaud == 0)
{
Send_stream("Can,125Kbps");
}
else if (CanBaud == 1)
{
Send_stream("Can,250Kbps");
}
else
{
Send_stream("Can,500Kbps");
}
Send_end();
Send_stream("Acceptance Code:");
Command[0] = Acr_data / 4096;
Command[1] = (Acr_data % 4096) / 256;
Command[2] = (Acr_data % 256) / 16;
Command[3] = Acr_data % 16;
for (t_c = 0; t_c < 4; t_c++)
{
Hex_to_ascii(&Command[t_c]);
}
Command[4] = 'H';
Command[5] = '\0';
Send_stream(Command);
Send_end();
Send_stream("Acceptance Mask:");
Command[0] = Amr_data / 4096;
Command[1] = (Amr_data % 4096) / 256;
Command[2] = (Amr_data % 256) / 16;
Command[3] = Amr_data % 16;
for (t_c = 0; t_c < 4; t_c++)
{
Hex_to_ascii(&Command[t_c]);
}
Command[4] = 'H';
Command[5] = '\0';
Send_stream(Command);
Send_end();
Recjs = 0;
//接收命令
while (1)
{
Dog();
if (_testbit_(RI))
{
REC_LED = 0;
t_c = SBUF;
if (Recjs < CMD_LENGHT)
{
Command[Recjs++] = t_c;
//是否有换行符
if (t_c == ASCII_LF && Recjs > 1)
{
//前面一个字符是否为回车符
if (Command[Recjs - 2] == ASCII_ENTER)
{
if (Perform_cmd() > 0)
{
//退出调试状态
break;
}
}
Recjs = 0;
}
}
else
{
Recjs = 0;
}
}
}
}
ES = 1;
}
//CAN发送程序
void Can_send_data(void)
{
union
{
uchar t[2];
uint cc;
}var;
uchar length;
//uchar length1;
//uchar length2;
uchar t_a;
uchar t_b;
//是否需要启动CAN发送数据
if (!Can_send_ready)
{
return;
}
//当前串口接收字节长度是否在约定范围内
if (Com_rxcount < COM_MIN)
{
//释放串口接收缓冲区
Com_rxcount = 0;
Can_send_ready = 0;
return;
}
//对串口数据进行判断
if (Com_rxbuf[0] == COM_HEAD && Com_rxbuf[Com_rxcount - 1] == COM_END)
{
var.cc = 0;
length = Com_rxcount - 3;
//统计累加和
for (t_a = 1; t_a < length; t_a++)
{
var.cc += Com_rxbuf[t_a];
}
//累加和是否相等
if (var.t[0] != Com_rxbuf[t_a] || var.t[1] != Com_rxbuf[t_a + 1])
{
//释放串口接收缓冲区
Com_rxcount = 0;
Can_send_ready = 0;
return;
}
}
//串口接收数据有误
else
{
//释放串口接收缓冲区
Com_rxcount = 0;
Can_send_ready = 0;
return;
}
//串口接收缓冲区数据转移到CAN发送缓冲区
Can_txcount = Com_rxcount;
for (t_a = 0; t_a < Can_txcount; t_a++)
{
Can_txbuf[t_a] = Com_rxbuf[t_a];
}
//释放串口接收缓冲区
Com_rxcount = 0;
Can_send_ready = 0;
//BasicCAN
if (Can_mode == 0)
{
/*
//至少两个字节
if (Can_txcount > 1)
{
//是否为远程帧
if ((Can_txbuf[1] & 0x10) > 0)
{
t_b = 0;
//无发送
while ((BASIC_STATUS_REG & 0x20) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -