来电显示盒数据的读取
c#项目要做个来电功能,买了个来电盒,不知道怎么去读取发送到电脑上的数据
来电盒是usb接口的,没有驱动的,该怎么办?
http://topic.csdn.net/u/20090907/16/e620012b-5daa-4005-a6ac-dae134936819.html
厂家给了个dll源码,c++的,但是运行不起。小的又看不懂代码,
老大些帮忙看看,完全不知怎么下手啊。
急啊,时间紧迫啊。
USBPhone::USBPhone()
{
DWORD id;
_thread_handle = CreateThread(NULL, 0, com_thread, this, 0, &id); //辅助线程
_notify_hwnd=NULL;
//初始化临界区
InitializeCriticalSection(&CriticalSection);
}
//释放资源
USBPhone::~USBPhone()
{
if(WaitForSingleObject(_thread_handle, 100) != WAIT_OBJECT_0)
TerminateThread(_thread_handle, 0);
CloseHandle(_thread_handle);
_thread_handle = NULL;
if(is_open())
{
close();
}
_notify_hwnd=NULL;
//删除临界区
DeleteCriticalSection(&CriticalSection);
}
bool USBPhone::open(int port=0,long lBandrate=0)//打开端口
{
if(g_HidHandle != INVALID_HANDLE_VALUE)
{
g_cLogReporter.TraceLog("话机已打开!");
return false;
}
GUID hidGuid;
HidD_GetHidGuid(&hidGuid);
HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,
NULL,
NULL,
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
if(!hDevInfo)
{
g_cLogReporter.TraceLog("获取HID设备信息失败!");
return false;
}
SP_DEVICE_INTERFACE_DATA devInfoData;
devInfoData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
int deviceNo = 0;
SetLastError(NO_ERROR);
while(GetLastError() != ERROR_NO_MORE_ITEMS)
{
if(SetupDiEnumInterfaceDevice (hDevInfo,
0,
&hidGuid,
deviceNo,
&devInfoData))
{
ULONG requiredLength = 0;
SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
NULL,
0,
&requiredLength,
NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength);
devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if(!SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
devDetail,
requiredLength,
NULL,
NULL))
{
g_cLogReporter.TraceLog("获取HID设备细节信息失败!");
free(devDetail);
return false;
}
HANDLE hidHandle = CreateFile(devDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
free(devDetail);
if(hidHandle==INVALID_HANDLE_VALUE)
{
g_cLogReporter.TraceLog("获取HID设备句柄失败!");
return false;
}
_HIDD_ATTRIBUTES hidAttributes;
if(!HidD_GetAttributes(hidHandle, &hidAttributes))
{
g_cLogReporter.TraceLog("获取HID设备属性失败!");
CloseHandle(hidHandle);
return false;
}
if(USB_VID == hidAttributes.VendorID &&
USB_PID == hidAttributes.ProductID &&
USBRS232_VERSION == hidAttributes.VersionNumber)
{
g_HidHandle = hidHandle;
break;
}
else
{
CloseHandle(hidHandle);
++deviceNo;
}
}
}
if(g_HidHandle == INVALID_HANDLE_VALUE)
{
g_cLogReporter.TraceLog("USB话机未联接! 请检查!");
return false;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return true;
}
bool USBPhone::close()//关闭端口
{
CloseHandle(g_HidHandle);
return true;
}
int USBPhone::read(char *buffer, int limit)//异步读
{
return( 0);
}
int USBPhone::write(char *buffer, int size) //异步写
{
LeaveCriticalSection(&CriticalSection);
return( 0 );
}
//监视线程
DWORD USBPhone::com_thread(LPVOID para)
{
USBPhone *pcom = (USBPhone *)para;
BYTE str[2];
BYTE DataBuf[50];
char btBuf[20];
memset(DataBuf,0,50);
memset(btBuf,0,20);
DWORD wCount=0;
int lenth=0;
BYTE *pBuff=NULL;
HANDLE hIOWaiter = CreateEvent(NULL, TRUE, FALSE, NULL);
if(hIOWaiter == NULL)
return 0;
OVERLAPPED ol;
ol.Offset = 0;
ol.OffsetHigh = 0;
ol.hEvent = hIOWaiter;
pcom->open(1,1);
while(1)
{
memset(str,0,2);
ResetEvent(hIOWaiter);
if(!ReadFile(g_HidHandle,str,2,&wCount,&ol))
{
DWORD err = GetLastError();
if(err != ERROR_IO_PENDING && err != ERROR_DEVICE_NOT_CONNECTED && g_KeepGoing)
{
g_cLogReporter.TraceLog("读操作错误: %d", err);
}
while(WaitForSingleObject(hIOWaiter, 2000) == WAIT_TIMEOUT)
{
if(!g_KeepGoing)
{
if(g_HidHandle != INVALID_HANDLE_VALUE)
{
CancelIo(g_HidHandle);
}
}
}
if(!GetOverlappedResult(g_HidHandle, &ol, &wCount, false))
{
err = GetLastError();
if(err != ERROR_DEVICE_NOT_CONNECTED && g_KeepGoing)
{
g_cLogReporter.TraceLog("GetOverlappedResult例程错误: %d", err);
}
continue;
}
}
pBuff=str;
pBuff++;
if(*pBuff!=0x0A)
{
//if(*pBuff==0x41)
// {
// lenth=0;
// }
DataBuf[lenth]=*pBuff;
lenth++;
continue;
}
else
{
if(DataBuf[0]!=0x41 || DataBuf[1]!=0x54 ||DataBuf[lenth-1]!=0x0D)
{
lenth=0;
}
else
{
switch(DataBuf[2])
{
case 'Z': //摘机命令
sprintf(btBuf,"摘机 操作成功!\r\n");
break;
case 'H': //挂机命令
sprintf(btBuf,"挂机 操作成功!\r\n");
break;
case 'B': //传号
sprintf(btBuf,"传号 操作成功!\r\n");
break;
case 'D': //拨号
sprintf(btBuf,"拨号 操作成功!\r\n");
break;
case 'R': //振铃
sprintf(btBuf,"有振铃...\r\n");
break;
case 'C': //来电号码
if(DataBuf[3]=='I')
{
BYTE *P=DataBuf;
BYTE ListBuf[20];
memset(ListBuf,0,20);
int i=0;
P+=5;
while(*P!=0x0D)
{
ListBuf[i]=*P;
i++;
P++;
}
sprintf(btBuf,"收到来电号码:%s\r\n",ListBuf);
}
else
sprintf(btBuf,"蜂鸣关!\r\n");
break;
case 'N': //接收DTMF
if(DataBuf[2]=='N')
{
BYTE *P=DataBuf;
BYTE ListBuf[20];
memset(ListBuf,0,20);
int i=0;
P+=3;
while(*P!=0x0D)
{
ListBuf[i]=*P;
i++;
P++;
}
sprintf(btBuf,"收到DTMF数据:%s\r\n",ListBuf);
}
break;
case 'M': //接收按键
//if(/*(lenth==5) && */((DataBuf[3]!='A')&&(DataBuf[3]!='B')&&(DataBuf[3]!='C')&&(DataBuf[3]!='D')))
if(/*(lenth==5) && */((DataBuf[3]!='A')||(DataBuf[3]!='B')||(DataBuf[3]!='C')||(DataBuf[3]!='D')))/*不上传功能键 有问题 不能屏蔽A*/
{
BYTE *P=DataBuf;
BYTE ListBuf[20];
memset(ListBuf,0,20);
int i=0;
P+=3;
while(*P!=0x0D)
{
ListBuf[i]=*P;
i++;
P++;
}
sprintf(btBuf,"收到按键值:%s\r\n",ListBuf);
}
else
{
continue;
}
break;
case 'O': //开蜂鸣
sprintf(btBuf,"蜂鸣开!\r\n");
break;
case 'F': //拍叉簧
sprintf(btBuf,"拍叉簧 操作成功!\r\n");
break;
case 'E': //锁键盘
sprintf(btBuf,"锁键盘 操作成功!\r\n");
break;
case 'G': //解开键盘
sprintf(btBuf,"开键盘 操作成功!\r\n");
break;
case 'I': //关耳机
sprintf(btBuf,"关耳机 操作成功!\r\n");
break;
case 'J': //开耳机
sprintf(btBuf,"开耳机 操作成功!\r\n");
break;
case 'K': //关麦克
sprintf(btBuf,"关麦克 操作成功!\r\n");
break;
case 'L': //开麦克
sprintf(btBuf,"开麦克 操作成功!\r\n");
break;
case 'T': //开始录音
sprintf(btBuf,"开始录音...\r\n");
break;
case 'Q': //结束录音
sprintf(btBuf,"录音结束\r\n");
break;
case 'P': //开始放音
sprintf(btBuf,"开始放音\r\n");
break;
case 'S': //结束放音
sprintf(btBuf,"放音结束\r\n");
break;
case 'W': //错误命令
sprintf(btBuf,"错误命令!\r\n");
break;
default:
sprintf(btBuf,"收到未知命令!\r\n");
break;
}
}
lenth=0;
::PostMessage(pcom->_notify_hwnd, EVT_LOG, (unsigned int)btBuf, lstrlen(btBuf));
// memset(DataBuf,0,50);
}
Sleep(500);
}
return TRUE;
}
//写命令
void USBPhone::writecmd(unsigned char cmd,unsigned char len,unsigned char*content)
{
unsigned char crcChar=0;
if(! is_open())
{
return ;
}
Sleep(120);
}
int USBPhone::getInstalled()
{
int iCom=0;
return iCom;
}
bool USBPhone::is_open()//判断是否打开端口
{
return false;
}
void USBPhone::set_hwnd(HWND hWnd)//设置事件窗口
{
_notify_hwnd = hWnd;
}
void USBPhone::set_runflag(bool isrun)//设置运行状态
{
if(is_open())
return;
_run_flag=isrun;
}
int USBPhone::checkRtn(unsigned char cmd,long lentime)
{
int iRtn=0;
return iRtn;
}