windows xp下我用pietty访问linux下的并口,一些问题请教

[复制链接]
2521|4
 楼主| xiaoyu9632 发表于 2007-6-25 13:55 | 显示全部楼层 |阅读模式
#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltstdlib.h&gt<br />#include&nbsp;&ltsys/io.h&gt<br />#include&nbsp;&ltsignal.h&gt<br />#include&nbsp;&ltunistd.h&gt<br /><br />#define&nbsp;Pbase&nbsp;0x378<br />#define&nbsp;CTLVFD&nbsp;0X37a<br /><br />void&nbsp;ctlled(unsigned&nbsp;char&nbsp;ctlbyte);<br /><br />int&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ioperm(Pbase,2,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;ioperm(CTLVFD,1,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;ctlled(0x8C);<br />}<br /><br />void&nbsp;ctlled(unsigned&nbsp;char&nbsp;ctlbyte)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;outb(ctlbyte,pbase);<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br /><br />我测试过,刚启动的系统并口状态(数据位)是低电平,当我运行我的程序的时候,输出电压变为3v多,这是为什么呢?按照道理应该是波形输出才对,现在的现象是outb(ctlbyte,pbase);这句话我就是写成outb(0xf0,pbase);也不会在有低电平输出了。郁闷中,各位朋友帮忙。
high 发表于 2007-6-25 15:28 | 显示全部楼层

h

#ifndef&nbsp;__PPT_H__<br />#define&nbsp;__PPT_H__<br /><br />//#include&nbsp;&ltasm/io.h&gt<br />#include&nbsp;&ltsys/io.h&gt&nbsp;/*&nbsp;2007-04-19&nbsp;chen&nbsp;yongqiang&nbsp;*/<br /><br />#define&nbsp;_inp(a)&nbsp;inb(a)<br />#define&nbsp;_outp(a,d)&nbsp;outb(d,a)<br /><br />int&nbsp;GetValidPpt(void);<br />int&nbsp;InstallGiveIo(void);<br />void&nbsp;SetPptCompMode(void);<br /><br />extern&nbsp;int&nbsp;validPpt;<br /><br />#define&nbsp;LPT1&nbsp;0x378&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;search&nbsp;order&nbsp;is&nbsp;LPT1&nbsp;then&nbsp;2&nbsp;then&nbsp;3<br />#define&nbsp;LPT2&nbsp;0x278&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;first&nbsp;valid&nbsp;address&nbsp;found&nbsp;is&nbsp;used&nbsp;(re-order&nbsp;if&nbsp;needed&nbsp;for&nbsp;multiple&nbsp;ports)<br />#define&nbsp;LPT3&nbsp;0x3bc&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;hardware&nbsp;base&nbsp;address&nbsp;for&nbsp;parallel&nbsp;port<br /><br />#define&nbsp;OutputPpt(value)&nbsp;&nbsp;&nbsp;&nbsp;_outp((unsigned&nbsp;short)validPpt,value)<br />#define&nbsp;InputPpt()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inp((unsigned&nbsp;short)(validPpt+0x1))<br /><br />#endif&nbsp;//__PPT_H__
high 发表于 2007-6-25 15:29 | 显示全部楼层

c

#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&quot;ppt.h&quot;<br /><br />int&nbsp;validPpt;&nbsp;<br />#ifdef&nbsp;__linux__<br />int&nbsp;io_access_on(&nbsp;unsigned&nbsp;long&nbsp;port&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ioperm&nbsp;(port,&nbsp;3,&nbsp;1))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror&nbsp;(&quot;ioperm()&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ioperm&nbsp;(0x80,&nbsp;1,&nbsp;1))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror&nbsp;(&quot;ioperm()&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />}<br /><br />void&nbsp;io_access_off(&nbsp;unsigned&nbsp;long&nbsp;port&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ioperm&nbsp;(port,&nbsp;3,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;ioperm&nbsp;(0x80,&nbsp;1,&nbsp;0);<br />}<br />#else<br />#define&nbsp;io_access_on(x)&nbsp;(1)<br />#define&nbsp;io_access_off(x)<br />#endif<br />int&nbsp;GetValidPpt(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;search&nbsp;for&nbsp;valid&nbsp;parallel&nbsp;port<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;io_access_on(LPT1)&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_outp(LPT1,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((int)_inp(LPT1)&nbsp;==&nbsp;0x55)&nbsp;return&nbsp;LPT1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io_access_off(LPT1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;io_access_on(LPT2)&nbsp;){&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_outp(LPT2,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((int)_inp(LPT2)&nbsp;==&nbsp;0x55)&nbsp;return&nbsp;LPT2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io_access_off(LPT2);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;io_access_on(LPT3)&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_outp(LPT3,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((int)_inp(LPT3)&nbsp;==&nbsp;0x55)&nbsp;return&nbsp;LPT3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io_access_off(LPT3);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />#define&nbsp;ECP_ECR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x402)<br />#define&nbsp;ECR_STANDARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x0)<br />#define&nbsp;ECR_DISnERRORINT&nbsp;&nbsp;&nbsp;&nbsp;(0x10)<br />#define&nbsp;ECR_DISDMA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x0)<br />#define&nbsp;ECR_DISSVCINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x4)<br /><br />void&nbsp;SetPptCompMode(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//configure&nbsp;the&nbsp;parallel&nbsp;port&nbsp;at&nbsp;the&nbsp;compatibility&nbsp;mode.<br />&nbsp;&nbsp;&nbsp;&nbsp;//_outp(validPpt+ECP_ECR,ECR_STANDARD&nbsp;|&nbsp;ECR_DISnERRORINT&nbsp;|&nbsp;ECR_DISDMA&nbsp;|&nbsp;ECR_DISSVCINT);<br />}<br />#ifndef&nbsp;__linux__<br />int&nbsp;InstallGiveIo(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;h;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSVERSIONINFO&nbsp;osvi;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;osvi.dwOSVersionInfoSize&nbsp;=&nbsp;sizeof(OSVERSIONINFO);<br />&nbsp;&nbsp;&nbsp;&nbsp;GetVersionEx(&osvi);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(osvi.dwPlatformId&nbsp;==&nbsp;VER_PLATFORM_WIN32_NT)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//OS=NT/2000<br />&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;=&nbsp;CreateFile(&quot;\.giveio&quot;,&nbsp;GENERIC_READ,&nbsp;0,&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPEN_EXISTING,&nbsp;FILE_ATTRIBUTE_NORMAL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(h);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(h&nbsp;==&nbsp;INVALID_HANDLE_VALUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0x2000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//OS=WIN98<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0x0098;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />#endif<br /><br />
 楼主| xiaoyu9632 发表于 2007-6-25 16:21 | 显示全部楼层

楼上的朋友

能不能详细解释下我的那种做法错误在哪里,你的程序好像是针对windows所写呀,可是我是linux下的。
high 发表于 2007-6-25 16:39 | 显示全部楼层

我给你的是linux下的而且是可以用。拜托您仔细点。

已经给您demo了还...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

159

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部