📄 csddemo.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 + -