C++-Windows系统下,如何读写并口
想通过并口控制外部电路。不知道该如何读写并口?网上搜索到的答案几乎全都是使用IO端口读写的方法。
但这种方法有一些缺陷。一方面,如果要在XP等较高版本系统上运作,需要额外的驱动;这会引起杀毒软件的抱怨。另一方面,一些转换出来的并口(例如通过“USB转并口”转换器),并没有对应的IO端口地址,无法运作。
另外还有一些搜索出来的结果,往往只是轻描淡写的一句:使用CreateFile打开设备文件,然后就可以像普通文件一样进行读写……
不知道各位有没有相关经验?最好能给出一段简单而直接可用的代码(C/C++)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
linux读写parport设备文件。猜想xp会有相关微软的api操作并口吧。
我用的就是winio这个头文件 操作并口的
我是用pc的并口模拟IIC时序与芯片进行通信。效果还不错。
贴一下我的代码片段
void WriteSda(BOOL b)
{
unsigned long lPortVal;
GetPortVal(BASE_PORT_ADDR, &lPortVal, 1);
//lt
//printf("The Address is:%x,The Value is:%xn",BASE_PORT_ADDR,(unsigned char)(lPortVal));
//lt
lPortVal &= 0xfd;
lPortVal |= b<<1;
//Sleep(1);
SetPortVal(BASE_PORT_ADDR, lPortVal, 1);
}
BOOL ReadSda()
{
unsigned long lPortVal;
GetPortVal(BASE_PORT_ADDR+1, &lPortVal, 1);
lPortVal >>= 4;
//Sleep(1);
return lPortVal&1;
}
void WriteScl(BOOL b)
{
unsigned long lPortVal;
GetPortVal(BASE_PORT_ADDR, &lPortVal, 1);
lPortVal &= 0xfe;
lPortVal |= b;
SetPortVal(BASE_PORT_ADDR, lPortVal, 1);
//Sleep(1);
}
BOOL ReadScl()
{
unsigned long lPortVal;
GetPortVal(BASE_PORT_ADDR, &lPortVal, 1);
//Sleep(1);
return lPortVal&1;
}
BOOL SendByte(unsigned char c)
{
int i, ret;
BOOL b;
WriteScl(LOW);
for(i=7; i>=0; i--)
{
b = (c>>i) & 1;
WriteSda(b);
//printf("%dn", b);
WriteScl(HIGH);
//Sleep(1);
WriteScl(LOW);
}
// Receive Ack
WriteScl(HIGH);
WriteSda(HIGH);
if(ReadSda())
{
//AfxMessageBox("Can't Receive ACK!!");//printf("Can't Receive ACK!!n");
devoffline = false;
ret = 0;
}
else
{
//printf("ACK=0n");
devoffline = true;
ret = 1;
}
WriteScl(LOW);
return ret;
}
void Ack()
{
WriteSda(0);
// Sleep(1);
WriteScl(1);
// Sleep(1);
WriteScl(0);
// Sleep(1);
}
void NoAck()
{
WriteSda(1);
WriteScl(1);
WriteScl(0);
}
void Start()
{
WriteSda(1);
WriteScl(1);
WriteSda(0);
}
void Stop()
{
WriteSda(0);
WriteScl(1);
WriteSda(1);
}
如果想进一步了解,可以和我联系,相互探讨。
企鹅号:19570995
E-mail:fjpmbb@126.com
xp下VC可以用winio或者用dlportio的实现,另外还有用porttalk和input32来实现的。网上应该能够找得到的。
我以前用LABView做的,就是并口控制步进电机,那时我是直接把数据写到内存里的,在电脑上能看见分配给并口的内存地址是多少,然后直接写数据。在C语言下没做过,不太清楚。不过VC应该有相关控件。
我提供一个思路,不一定行:
我记得以前我看过读写串口函数的实现,发现都是都串口地址的操作,比如把某个数据写道某个地址,用write函数,所以,lz可以考虑一下这个方法行不行