juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1526回复:12

win2k下的并口操作,请指教

楼主#
更多 发布于:2003-07-10 09:04
我用
HANDLE m_hCardInterFace = CreateFile(\"\\\\\\\\.\\\\LPT1 \",
GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
NULL,
NULL);
打开并口成功后,对并口进行了写操作,结果在WriteFile函数中没有了反应
DWORD dwRead;
unsigned int command = 0xff;
BOOL ret = WriteFile( m_hCardInterFace,
&command,
1,
&dwRead,
NULL);
不知道有什么不妥的地方?是否和同步还是异步方式有关呢?

另外,所谓的对并口写是否就是只对数据寄存器进行写呢?还是也可以对
控制和状态寄存器进行操作呢?
谢谢!

最新喜欢:

wm_createwm_cre...
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-10 09:26
对端口进行读还是写操作,要看硬件的设计了,一般情况下,控制口是用来写的,状态口是用来读的,数据口,可以是双向的。

个人之见
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-10 09:40
这个我知道,就是不知道为什么WriteFile函数不能返回。
我的并口是空的,我想试试可不可以直接对它进行操作
因为并口的三个register是相连的i/o空间中的地址,所以我
想如果可以写数据口的话,那么如果增加我写内容的长度,比如
从Byte到Word什么的,那么或许可以对状态或控制寄存器进行操作
了,当然我想这也取决底层驱动实现的write操作
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-10 11:01
没有硬件,这个函数使用正确的话,也能成功返回啊,好好看看这个函数的使用说明,并口的寄存器都是8位的,用BYTE就可以了。你往哪个口写数据,这个函数里的地址偏移量就用哪个 口对应的地址与基地址的差值就可以了。这个很简单应当没什么问题的。
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-10 11:23
那个函数我几经看了好几遍msdn了,实在是看不出有什么地方有问题
另外,你所说的哪个口的问题我不是很明白啊,函数参数中也没有对应的参数啊,打开并口后,所有的东西就是一个句柄,我想再user mode下也不太可能让你直接用端口地址吧。
谢谢你参与讨论这个问题,要不你看看WriteFile这个函数,不胜感激,呵呵
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-10 13:24
 我是用DS写的ISA的驱动,我是用的DEVICEIOCTL,我想WRITEFILE和这个差不多。
在你的WRITEFILE这个函数里的参数:&command,
1,我感觉用的不太对,这个1表示什么?应该上是缓冲区的大小,就是:&command的大小,你换成sizeof(unsigned int)试试。

个人之见!
不必客气!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-10 13:35
我试过了,没用
我想那个参数可能是用在缓冲区包含了多于要写的内容的时候
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-10 20:44
你试着在应用程序里用malloc函数分配一个缓冲区。
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
funny
驱动小牛
驱动小牛
  • 注册日期2003-04-17
  • 最后登录2021-07-30
  • 粉丝0
  • 关注0
  • 积分1012分
  • 威望178点
  • 贡献值0点
  • 好评度123点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-07-16 13:47

to juventus
:
first
 首先确定是否已打开了并口:
second
 应把得知换成unsigned int command = 0xff
 强制装换成dword;
 我用过这样的程序,应该能解决!!!
驱动现在,成就未来
peng422
驱动牛犊
驱动牛犊
  • 注册日期2003-06-15
  • 最后登录2003-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-16 18:57
老大,用unsigned int太浪费了,用unsigned char哦
peng422
驱动牛犊
驱动牛犊
  • 注册日期2003-06-15
  • 最后登录2003-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-16 19:03
看我的,别笑:(
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
dmxdata=TrackBar1->Position;
Label1->Caption=IntToStr(dmxdata);
 DWORD number; HANDLE h;
 a=&dmxdata;
h=::CreateFile(\"LPT1\",GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
::WriteFile(h,a,1,&number,NULL);
::CloseHandle(h);
}
如果要查并口状态,可以这样
if(h==INVALID_HANDLE_VALUE)
{
;//你的代码
}

}
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-17 12:24
先看看WriteFile函数的返回代码再分析。这样才能有的放矢。
tangwise
驱动牛犊
驱动牛犊
  • 注册日期2003-11-06
  • 最后登录2007-06-12
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-01-05 21:03
 WriteFile (hLpt1, pBuffer, iFileLength * sizeof (TCHAR),&dwBytesWritten, NULL) ;
游客

返回顶部