最近想直接控制主板IO口搞点东西,如并口,串口,,想输出如38K (26us)的方波,或者采集38K的波形输入。 我做了以下尝试,在循环中直接读取IO的状态变化, 发现采集的不是很精确,采集到的波形变化有漏 的,也很随机。说明这种方式达不到精度。 是否可以用中断来采集?
我找了一些资料,发现有这么用句话:“win 不是一个实时系统”,所以对我的想法产生了怀疑。难道windows不能做这样的事情? 想来也是,大都是计算机和芯片通讯,芯片做采集工作。
我也在想在usb线上不接任何芯片,在pc驱动程序上直接控制usb的一根线输出方波, 是否可行?
请高手解惑这方面的疑问、。
我的采集代码如下:
ULONG mCurrStatus,mTemp;
int ircount;
ircount = 0;
mCurrStatus = _inp(0x0379);
while(1)
{
if(ircount == 0)
{
mTemp = _inp(0x0379);
if (mTemp!=mCurrStatus)
{
KeQueryTickCount(&tm1);
mCurrStatus = mTemp;
ircount++;
}
} else
{
mTemp = _inp(0x0379);
if (mTemp!=mCurrStatus)
{
KeQueryTickCount(&tm1);
mCurrStatus = mTemp;
ircount++;
if(ircount>6000)
break;
}else
{
KeQueryTickCount(&tm2);
if((tm2.QuadPart-tm1.QuadPart)>32)
break;
}
}
}
可以每一个pc用的采集卡,1000-6000元都有, 研华什么的,
如果你熟悉硬件,就自己做一个,用单片机来采集,然后把数据发送给pc 也ok,
计算机原理一知半解的我在琢磨: 计算机的cpu及其资源比起单片机丰富多了,为什么单片机绰绰有余的事情,PC干不了?但如串口的波特率可以达到比38K载波很多的精度了,为什么不能做这样的事情? 是微软设计windows的不是这个方向?我在想应该不是不可以,而是被win的“屏蔽”了或者是没有找到方法。
对于三楼的兄弟说采集卡。呵呵,1块钱的单片机芯片就可以了,用不到1千的。
刚在网上搜索到一个论文,说是在win的并口驱动的基础上实现了采集1m字节的精度,对驱动刚刚接触的我看不懂。
是不是可以在驱动的“优先级”上下文章,或者是执行采集的中间用“关闭中断”的方法。。。
我在arm7的linux上也是在驱动层采集的过程中把中断关闭,“一心一意”的去判断io的变化。 精度也可以达到几us,对于38K的足够了。
在windows上,哪个驱动高手指明下方向?
windows做了一层有一层的封装,以至于很多的东西是无法自己直接操作的。这也是在开发的时候为了系统安全等因素刻意设计的。并不是说硬件本身不支持这种操作。相信双核的P4在性能上应该远远优于普通的arm芯片。把PC平台当成一个特殊的嵌入式平台的话,它的性能是相当不错的。
我一个哥们儿在PC上操作并口模拟过JTAG操作,是可以成功的,不过他PC程序设计基础有限,也没有时间做更多的尝试,所以最后速度上没有达到预想中的要求。实际上也有可能是操作并口需要调用Windows接口函数,导致控制起来没有直接操作那么得心应手的原因。
windows 上控制硬件设备 的确有些麻烦。
楼主可以去 图书馆借几本相关的书籍看看,
现在有很多书籍 讲利用PC做数据采集,即虚拟仪器的书籍。