1.vs.net 2008里面创建smart device project,选择DLL。
2.程序如下:
// 6410ADCDLL.cpp : 定义 DLL 应用程序的入口点。
//
#pragma once
#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/nodefaultlib:libcd.lib")
// 注意 - 这个值与作为目标的 Windows CE OS 版本的关联性并不强
#define WINVER _WIN32_WCE
#include <ceconfig.h>
#include <altcecrt.h>
#include "stdafx.h"
DWORD CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access)
{
return ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method);
}
#define FILE_SHARE_READ 0x00000001
#define FILE_SHARE_WRITE 0x00000002
#define OPEN_EXISTING 3
#define FILE_FLAG_RANDOM_ACCESS 0x10000000
#define FILE_DEVICE_UNKNOWN 0x00000022
#define IOCTL_UNKNOWN_BASE FILE_DEVICE_UNKNOWN
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS 0x0001
#define FILE_WRITE_ACCESS 0x0002
#define IOCTL_ADC_START CTL_CODE(FILE_DEVICE_UNKNOWN, 60, METHOD_BUFFERED, FILE_ANY_ACCESS) //60???
#define IOCTL_ADC_STOP CTL_CODE(FILE_DEVICE_UNKNOWN, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
HANDLE hAdc;
HANDLE hThread;
HANDLE hAdcEvent;
DWORD WINAPI AdcThread (PVOID);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern "C" _declspec(dllexport) BOOL initADC();
BOOL initADC()
{
hAdc = CreateFile(TEXT("ADC1:"),GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if (hAdc == INVALID_HANDLE_VALUE)
{
//printf ("can't open device\r\n");
return FALSE;
}
else
{
//printf ("Open ADC1\r\n");
//hThread = CreateThread (NULL, 0, AdcThread, NULL, 0, NULL);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
//hThread = CreateThread (NULL, 0, AdcThread, NULL, 0, NULL);
}
DWORD WINAPI AdcThread (PVOID hdcMain)
{
DWORD dwBytesRead;
DWORD convalue;
//char tempvalue[3];
//CString str;
//CADC_AppDlg *pdlg =(CADC_AppDlg*)(AfxGetApp()->m_pMainWnd);
hAdcEvent = CreateEvent(NULL, TRUE, FALSE, _T("TE6410_ADC_read"));
while(1)
{
WaitForSingleObject(hAdcEvent, INFINITE);
ReadFile(hAdc, &convalue, sizeof(DWORD), &dwBytesRead, NULL);
//str.Format(_T("%d"),convalue);
//pdlg->SetDlgItemTextW(IDC_EDIT1,str);
//printf("convalue = %d !!!!\n", convalue);
Sleep(2);
}
return convalue;
}
extern "C" _declspec(dllexport) UINT ADCStart();
UINT ADCStart()
{
DWORD dwBytesRead;
DWORD convalue;
DeviceIoControl (hAdc, IOCTL_ADC_START, NULL, 0, NULL, 0, NULL, NULL);
SetEvent(hAdcEvent);
ReadFile(hAdc, &convalue, sizeof(DWORD), &dwBytesRead, NULL);
//char tempvalue[3];
//CString str;
//CADC_AppDlg *pdlg =(CADC_AppDlg*)(AfxGetApp()->m_pMainWnd);
convalue=convalue+1;
ResetEvent(hAdcEvent);
DeviceIoControl (hAdc, IOCTL_ADC_STOP,
NULL, 0,
NULL, 0, NULL, NULL);
return convalue;
//return 1;
}
extern "C" _declspec(dllexport) BOOL ADCStop();
BOOL ADCStop()
{
ResetEvent(hAdcEvent);
DeviceIoControl (hAdc, IOCTL_ADC_STOP,
NULL, 0,
NULL, 0, NULL, NULL);
return 1;
编译陈功后有6410ADCDLL.dll文件
3.C#中调用
首先是先添加到工程中,然后添加如下程序
[DllImport("Coredll.dll", EntryPoint = "CloseHandle",SetLastError = true)]
static extern int CloseHandle(IntPtr hObject);
[DllImport("6410ADCDLL.dll", EntryPoint = "initADC", SetLastError = true)]
static extern bool initADC();
[DllImport("6410ADCDLL.dll", EntryPoint = "ADCStart", SetLastError = true)]
static extern uint ADCStart();
[DllImport("6410ADCDLL.dll", EntryPoint = "ADCStop", SetLastError = true)]
static extern bool ADCStop();
private void button7_Click(object sender, EventArgs e)
{
initADC();
}
private void button8_Click(object sender, EventArgs e)
{
uint d;
d=ADCStart();
d = ADCStart();
MessageBox.Show(d.ToString());
d = d + 1;
}
调试的时候将断点设置到变量d上面就可以看到结果