阅读:1024回复:2
请教数据采集问题?
AD卡是ISA总线的,在98下的程序如下:
#include <dos.h> main() { unsigned char dataL,dataH; unsigned int result; outportb(0x22C,0x10); for(int i=0;i<1000;i++);//延时50微秒 outportb(0x22B,0x30); outportb(0x228,0x10); for(i=0;i<50;i++); outportb(0x228,0x00); for(i=0;i<1000;i++); dataL=inportb(0x221); for(i=0;i<50;i++); dataH=inportb(0x220); result=(unsigned int)((dataH&0x0f)*256+dataL); printf("result=%d\n",result); } 现在在2000下用,是不是只要开发一个驱动程序实现I/O口的读写函数就行了。还是别的什么方法处理?请指教,谢谢 |
|
沙发#
发布于:2004-10-11 10:40
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2004-10-11 11:51
我把上面的数据采集程序写在驱动程序里,代码如下:
NTSTATUS ADRWDevice::ADRW_IOCTL_800_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; m_IoPortRange1.outb(0x5,0x10);//m_IoPortRange1对应I/O (228-22C) for(int i=0;i<2000;i++); m_IoPortRange1.outb(0x4,0x30); m_IoPortRange1.outb(0x0,0x10); for(i=0;i<50;i++); m_IoPortRange1.outb(0x0,0x00); for( i=0;i<2000;i++); UCHAR dataL= m_IoPortRange0.inb(0x1);//m_IoPortRange0对应I/O (220-221) for( i=0;i<50;i++); UCHAR dataH=m_IoPortRange0.inb(0x0); ULONG result=(ULONG)((dataH&0x0f)*256+dataL); *(ULONG*)(I.IoctlBuffer())=result; I.Information() = sizeof(ULONG); return status; } 应用程序:ULONG Test_ADRW_IOCTL_800(void) { ULONG bufOutput; ULONG nOutput; if (!DeviceIoControl(hDevice, ADRW_IOCTL_800, NULL, 0, &bufOutput, sizeof(ULONG), &nOutput, NULL) ) { printf("ERROR: DeviceIoControl returns %0x.", GetLastError()); Exit(1); } return bufOutput; } 这程序读得的结果是零(正确的是2048),另外只在驱动程序里实现读写函数,采集程序写在应用程序里:读的结果也是这样。这问题在那,怎么解决,谢谢。 |
|