用vc实现操作usb设备(打印机)

zhuxuefengjssn 2008-06-26 10:52:36
怎样用vc实现图形界面与打印机链接并向打印机发送要打印的数据并且能读取打印机实际接收到的数据(通过usb链接的).谢谢!谢谢各位高手了,最好有源码zhuxuefengjssn@yahoo.com.cn
...全文
442 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuxuefengjssn 2008-07-14
  • 打赏
  • 举报
回复
自己再顶一下,请高手指点呀! 谢谢!
zhuxuefengjssn 2008-07-07
  • 打赏
  • 举报
回复
谢谢您的回复,我试了,这段程序通过USB端口实现不了,读取和写入没有任何反应,谢谢您!
再次谢谢您的赐教!!!!!
yzcurry 2008-06-30
  • 打赏
  • 举报
回复
//***************************************************************//
// 函数功能:调用读串口API的函数 //
// 函数参数:存放串口内容的字符串及要读取的长度 //
// 函数返回值:读入的长度 //
// 编写人:孙雪松 编写日期:2003年11月21日 //
//***************************************************************//

DWORD CDownLoadWavDlg::ReadComm(char *buf,DWORD dwLength)
{
BOOL fState;
DWORD length=0;

COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(hPipeRead,&dwErrorFlags,&ComStat);
length=min(dwLength,ComStat.cbInQue);
//读串口
fState=ReadFile(hPipeRead,buf,length,&length,NULL);//
return length;
}

//***************************************************************//
// 函数功能:调用写串口API的函数. //
// 函数参数:将要写的内容及和长度 //
// 函数返回值: 写入的长度 //
// 编写人:孙雪松 编写日期:2003年11月21日 //
//***************************************************************//

DWORD CDownLoadWavDlg::WriteCommand(char *buf,DWORD dwLength)
{
BOOL fState;
DWORD length=0;
length=dwLength;

COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(hPipeWrite,&dwErrorFlags,&ComStat);
PurgeComm(hPipeWrite, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
//写串口
fState=WriteFile(hPipeWrite,buf,length,&length,NULL);
return length;
}

//***************************************************************//
// 函数功能:读串口中的数据函数(并可做一定的处理) //
// 函数参数:参数一,串口事件,参数二,未用 //
// 函数返回值:0为正确,-1为错误 //
// 编写人:孙雪松 编写日期:2003年11月21日 //
//***************************************************************//
int CDownLoadWavDlg::ThreadReadCom(WPARAM wParam,LPVOID pParam)
{
char buf[64];
int nLength;

if((wParam & EV_RXCHAR)!=EV_RXCHAR)
{
return 0;
}

//读数据
nLength=ReadComm(buf,64);

if(nLength)
{
for(int i=0;i<nLength;i++)
{
bufReturn[i]=buf[i];//+ReLenght
}
}

/* CString aaa,bbb;
for(int j=0;j<nLength;j++)
{
aaa.Format("0X%02x ",bufReturn[j]);
bbb+=aaa;
}
m_list.AddString(bbb);*/

ReadEvent.SetEvent();

return nLength;
}

int CDownLoadWavDlg::CloseUSB()
{
eventkill.SetEvent();
m_pThread=NULL;

SetEvent(m_hPostMsgEvent);

if(m_hPostMsgEvent)
CloseHandle(m_hPostMsgEvent);

if(m_osRead.hEvent)
CloseHandle(m_osRead.hEvent);
if(m_osWrite.hEvent)
CloseHandle(m_osWrite.hEvent);

if(hPipeRead != INVALID_HANDLE_VALUE) //打开 Pipe 成功
{
CloseHandle(hPipeRead);
}

if(hPipeWrite != INVALID_HANDLE_VALUE) //打开 Pipe 成功
{
CloseHandle(hPipeWrite);
}

return 1;
}




void CDownLoadWavDlg::OnButtonOpen()
{
// TODO: Add your control notification handler code here

//驱动程序里面的读Pipe名, 对应访问某个端点的 I/O, 需要与驱动一致
m_Scroller.Cleanup();
m_list.ShowWindow(SW_SHOWNORMAL);

hPipeRead = OpenMyDevPipe("PIPE00");
if(hPipeRead != INVALID_HANDLE_VALUE) //打开读Pipe成功
{
//m_list.AddString("提示:读端点0打开成功.");
m_list.InsertItem("提示:读端点0打开成功.", 0, RGB(0,0,0), RGB(9,239,26));
}
else
{
//m_list.AddString("提示:读端点0未打开成功.");
m_list.InsertItem("提示:读端点0未打开成功.", 0,RGB(0,0,0),RGB(9,239,26));
}
//驱动程序里面的写Pipe名, 对应访问某个端点的 I/O, 需要与驱动一致
hPipeWrite= OpenMyDevPipe("PIPE01");
if(hPipeWrite != INVALID_HANDLE_VALUE) //打开写Pipe成功
{
//m_list.AddString("提示:写端点1打开成功.");
m_list.InsertItem("提示:写端点1打开成功.", 0,RGB(0,0,0), RGB(9,239,26));
}
else
{
//m_list.AddString("提示:读端点1未打开成功.");
m_list.InsertItem("提示:读端点1未打开成功.", 0,RGB(0,0,0),RGB(9,239,26));
}
}

void CDownLoadWavDlg::OnCancel()
{
// TODO: Add extra cleanup here
CloseUSB();
m_Ticker.Cleanup();
m_Scroller.Cleanup();
CDialog::OnCancel();
}
yzcurry 2008-06-30
  • 打赏
  • 举报
回复
UINT CommProcOne(LPVOID pParam)
{
COMSTAT ComStat;
DWORD dwErrorFlags;
int ReTemp=0;
CDownLoadWavDlg *pdlg=(CDownLoadWavDlg *)pParam;

while(1)
{
if (::WaitForSingleObject(pdlg->eventkill,0)==WAIT_OBJECT_0)
{
break;
}
//字符数2
ClearCommError(hPipeRead,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue>0)
{
WaitForSingleObject(pdlg->m_hPostMsgEvent,INFINITE);
ResetEvent(pdlg->m_hPostMsgEvent);

ReTemp=pdlg->ThreadReadCom(EV_RXCHAR,0);

ReLenght+=ReTemp;
//1为命令包的长度
if (ReLenght>=2)
{
//::WaitForSingleObject(pdlg->MSGevent,INFINITE);
ReLenght=0;
}
//continue;
}
}
return 0;
}
HANDLE CDownLoadWavDlg::OpenOneDevice(HDEVINFO hDvcInfo, PSP_INTERFACE_DEVICE_DATA DvcInfoData, char *sDevNameBuf)
{
HANDLE hOut = INVALID_HANDLE_VALUE;

ULONG iReqLen = 0;
SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, NULL, 0, &iReqLen, NULL);

ULONG iDevDataLen = iReqLen; //sizeof(SP_FNCLASS_DEVICE_DATA) + 512;
PSP_INTERFACE_DEVICE_DETAIL_DATA pDevData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);

pDevData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if(SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, pDevData, iDevDataLen, &iReqLen, NULL))
{
strcpy(sDevNameBuf, pDevData->DevicePath);
hOut = CreateFile(pDevData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
}

free(pDevData);
return hOut;
}

HANDLE CDownLoadWavDlg::OpenUsbDevice(LPGUID pGuid, char *sDevNameBuf)
{
HANDLE hOut = INVALID_HANDLE_VALUE;

HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);

SP_INTERFACE_DEVICE_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);

ULONG nGuessCount = MAXLONG;
for(ULONG iDevIndex=0; iDevIndex<nGuessCount; iDevIndex++)
{
if(SetupDiEnumDeviceInterfaces(hDevInfo, 0, pGuid, iDevIndex, &deviceInfoData))
{
if((hOut=OpenOneDevice(hDevInfo, &deviceInfoData, sDevNameBuf)) != INVALID_HANDLE_VALUE)
break;
}
else if(GetLastError() == ERROR_NO_MORE_ITEMS) //No more items
{
break;
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return hOut;
}

bool CDownLoadWavDlg::GetUsbDeviceFileName(LPGUID pGuid, char *sDevNameBuf)
{
HANDLE hDev = OpenUsbDevice(pGuid, sDevNameBuf);
if(hDev != INVALID_HANDLE_VALUE)
{
CloseHandle(hDev);
return true;
}
return false;
}

HANDLE CDownLoadWavDlg::OpenMyDevice()
{
char DeviceName[512] = "";
return OpenUsbDevice((LPGUID)&GUID_CLASS_D12_BULK, DeviceName);
}

HANDLE CDownLoadWavDlg::OpenMyDevPipe(const char *PipeName)
{
char DeviceName[512] = "";
if(GetUsbDeviceFileName((LPGUID)&GUID_CLASS_D12_BULK, DeviceName))
{
strcat(DeviceName,"\\");
strcat(DeviceName,PipeName);
return CreateFile(DeviceName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
}
return INVALID_HANDLE_VALUE;
}

zhuxuefengjssn 2008-06-27
  • 打赏
  • 举报
回复
我用createfile()打开了usb口,可是使用readfile()和writefile()都出错,就是读不到数据也写出错.不知道是为什么,请各位大侠出手帮帮忙.在createfile()之后怎么样能把数据发到打印机并打印出来呀.谢谢大侠指点,谢谢了.

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧