社区
硬件/系统
帖子详情
用vc实现操作usb设备(打印机)
zhuxuefengjssn
2008-06-26 10:52:36
怎样用vc实现图形界面与打印机链接并向打印机发送要打印的数据并且能读取打印机实际接收到的数据(通过usb链接的).谢谢!谢谢各位高手了,最好有源码zhuxuefengjssn@yahoo.com.cn
...全文
442
5
打赏
收藏
用vc实现操作usb设备(打印机)
怎样用vc实现图形界面与打印机链接并向打印机发送要打印的数据并且能读取打印机实际接收到的数据(通过usb链接的).谢谢!谢谢各位高手了,最好有源码zhuxuefengjssn@yahoo.com.cn
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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()之后怎么样能把数据发到打印机并打印出来呀.谢谢大侠指点,谢谢了.
VC
下通过
USB
接口访问
USB
设备
通过
USB
接口控制
USB
设备
的类。样例程序用于控制访问
USB
打印机
,可
实现
查询
打印机
状态、
打印机
标识、读写数据。 通过对PID及VID的匹配,可避免错误打开其它
设备
的可能。
vc
打印机
源代码.rar
vc
打印机
源代码.rar
软件重启硬件
USB
端口
VC
源代码
一般硬件
USB
端口通信有故障时,如
打印机
。串口,需要重插拔才见效时,这个就可以通过软件禁用再启用即可达到软件相当硬件插拔的效果
USB
双向通信上位机
VC
++程序
用于
Usb
双向通信的
VC
++程序 一个靠
USB
设置的VID、PID、PVN来查找
设备
并进行
设备
进行读写
操作
的示例
打印机
驱动自动安装
VC
源代码.zip
USB
打印机
自动识别安装程序 通过注册表查找
USB
打印机
枚举信息 设置对饮的
USB
端口 加载
打印机
驱动程序 程序兼容Xp win7 和win10,
打印机
驱动开发必备软件源码之一
硬件/系统
2,640
社区成员
17,239
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章