⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 232tocan.c

📁 RS232/CAN转换器 硬件电路需自己设计(电路很简单)
💻 C
📖 第 1 页 / 共 4 页
字号:
            }
            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 + -