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

📄 csddemo.cpp

📁 dos下使用查询模式实现CAN网络的测试程序
💻 CPP
字号:
// csddemo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <winioctl.h>
#include "csd.h"


ULONG DEVADDR1=0xd000;   //  CAN1的基地址
ULONG DEVADDR2=0xd400;   //  CAN2的基地址
int irq1=10;            //  CAN1的中断号
int irq2=10;           //  CAN2的中断号

PORT_STRUCT ptrStruct;
CAN_RPACKET can_rpacket;
CAN_PACKET can_packet; 
unsigned char num=0;

HANDLE hEvent1,hEvent2;

void CanInit()  //  CAN端口初始化
{

  ptrStruct.filter=SINGLE;
  ptrStruct.lis_on=LOFF;
  ptrStruct.test=TOFF;
  ptrStruct.sleep=SOFF;
  ptrStruct.baud_rate=B1000;
  ptrStruct.code1=0;
  ptrStruct.code2=0;
  ptrStruct.code3=0;
  ptrStruct.code4=0;
  ptrStruct.mask1=0xff;
  ptrStruct.mask2=0xff;
  ptrStruct.mask3=0xff;
  ptrStruct.mask4=0xff;
  
  
  CSD_CanConfigPort(1,ptrStruct);        // 配置CAN1口
  CSD_CanConfigPort(2,ptrStruct);        // 配置CAN2口

  CSD_CanEnableReceive(1);     // 使能CAN1口接收           
  CSD_CanEnableReceive(2);     // 使能CAN2口接收             
}  	

void Send1()     // CAN1口发送报文
{
	  int t;

      can_packet.f_pattern = E;
	  can_packet.f_type = D;
	  can_packet.byte_len = EIGHT;
	  can_packet.id1 =0x10;
	  can_packet.id2 =0x20;
	  can_packet.id3 =0x30;
	  can_packet.id4 =0x40;
	  for(t=0;t<8;t++)
	  {
	   can_packet.data[t] = num++;
	  }
	  if(CSD_CanSendMsg(1,can_packet) != 0)  
	  {
		  printf("Send error!");
			 //.
		  exit(1);
	  }
}

void Send2()       // CAN2口发送报文
{
	  int t;

      can_packet.f_pattern = E;
	  can_packet.f_type = D;
	  can_packet.byte_len = EIGHT;
	  can_packet.id1 =0x10;
	  can_packet.id2 =0x20;
	  can_packet.id3 =0x30;
	  can_packet.id4 =0x40;
	  for(t=0;t<8;t++)
	  {
	   can_packet.data[t] = num++;
	  }
	  if(CSD_CanSendMsg(2,can_packet) != 0)  
	  {
		  printf("Send error!");
			//  exit(1);
	  }
}

void Rcv1()    // CAN1口接收报文
{
	    int t;
        t=CSD_CanRcvMsg(1,&can_rpacket);    
		
		if(t == 0)
		{
		printf(" ff:");
		printf("%x",can_rpacket.ff);
		printf(" id:");
		printf("0x%x ",can_rpacket.id1);
		printf("0x%x ",can_rpacket.id2);
		printf("0x%x ",can_rpacket.id3);
		printf("0x%x",can_rpacket.id4);
		printf(" data(char format):");
		printf("%02x-",can_rpacket.data[0]);
		printf("%02x-",can_rpacket.data[1]);
		printf("%02x-",can_rpacket.data[2]);
		printf("%02x-",can_rpacket.data[3]);
		printf("%02x-",can_rpacket.data[4]);
		printf("%02x-",can_rpacket.data[5]);
		printf("%02x-",can_rpacket.data[6]);
		printf("%02x",can_rpacket.data[7]);
		printf("\n");
		}
}

void Rcv2()        // CAN2口接收报文
{
	    int t;
        t=CSD_CanRcvMsg(2,&can_rpacket);    
		
		if(t == 0)
		{
		printf(" ff:");
		printf("%x",can_rpacket.ff);
		printf(" id:");
		printf("0x%x ",can_rpacket.id1);
		printf("0x%x ",can_rpacket.id2);
		printf("0x%x ",can_rpacket.id3);
		printf("0x%x",can_rpacket.id4);
		printf(" data(char format):");
		printf("%02x-",can_rpacket.data[0]);
		printf("%02x-",can_rpacket.data[1]);
		printf("%02x-",can_rpacket.data[2]);
		printf("%02x-",can_rpacket.data[3]);
		printf("%02x-",can_rpacket.data[4]);
		printf("%02x-",can_rpacket.data[5]);
		printf("%02x-",can_rpacket.data[6]);
		printf("%02x",can_rpacket.data[7]);
		printf("\n");
		}
	   
}

//CAN1口的线程被驱动程序唤醒,用来通知应用程序中断到来

DWORD WINAPI ServiceThread1(PVOID hEvent) 
{
	int v;

	while (TRUE)
	{
		   v = CSD_InquiryCanMes(1);
	       if(v == 1)
	       {
		printf("CAN1:");
                Rcv1();	
		Send1();
	       }	
		   else if(v == 2)
		   {
			   printf("\nerror1");
			   CSD_ResetCan(1);
			   Send1();
           }
	}
	return 0;		
}


//CAN2口的线程被驱动程序唤醒,用来通知应用程序中断到来

DWORD WINAPI ServiceThread2(PVOID hEvent)   
{
	int v;

	while (TRUE)
	{
		   v = CSD_InquiryCanMes(2);
	       if(v == 1)
	       {
		printf("CAN2:");
                Rcv2();	
		Send2();
	       }	
		   else if(v == 2)
		   {
			   printf("\nerror2");
			   CSD_ResetCan(2);
			   Send2();
           }
	}
	return 0;	
}

void hevent()  // CAN端口事件
{
	DWORD Tid; 
	//CSD_SetEvent(1,hEvent1,0x1000,ServiceThread1);         // 产生一个通知CAN1口事件发送到驱动程序并且产生一个等待CAN1口事件的线程
	//CSD_SetEvent(2,hEvent2,0x1000,ServiceThread2);         // 产生一个通知CAN2口事件发送到驱动程序并且产生一个等待CAN2口事件的线程
	  hEvent1 = CreateEvent(0,FALSE,FALSE,NULL);
	  CreateThread(0, 0x1000, ServiceThread1, hEvent1, 0, &Tid); 
	   hEvent2 = CreateEvent(0,FALSE,FALSE,NULL);
	  CreateThread(0, 0x1000, ServiceThread2, hEvent2, 0, &Tid); 
}	

int main(int argc, char* argv[])
{
	HINSTANCE handlerDLL = NULL;
   	
	handlerDLL = LoadLibrary("csd.dll");  //  加载动态链接库
	if(handlerDLL == NULL)
	{
		printf("Cannot Load the csd.dll");
		exit(0);
	}
	else
	{
		printf("Already Load the csd.dll\n");
	}
	HANDLE h=CSD_DevLoad();             //     加载驱动程序
	if (h==INVALID_HANDLE_VALUE) 
    {
                printf("无法加载驱动程序!");
		        exit(1);;
   }
       
    CSD_Init(0x140);         //  初始化CSD设备
   
	CSD_CanConfig(DEVADDR1,DEVADDR2,irq1,irq2,1);  //  配置CAN端口的基地址和中断号

    CSD_CanInstall(1,DEVADDR1,irq1);   //  安装CAN1口
    CSD_CanInstall(2,DEVADDR2,irq2);   //  安装CAN2口
       

    CanInit();   //  CAN端口初始化

    hevent();

	CSD_CanClearRxBuffer(1);   // 清除CAN1口接收缓冲区
    CSD_CanClearRxBuffer(2);   // 清除CAN2口接收缓冲区
 
	printf("Press any key to send...\n");
    getch();
    Send1();   // CAN1口发送报文
	while (TRUE)
  	{
	   if(kbhit()) break;
	}	
    getch();
	CloseHandle(hEvent1);   
	CloseHandle(hEvent2); 
    CSD_DevClose();        //    卸载驱动程序
	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -