标题:关于USB上位机中断程序 急!
只看楼主
lanshanlhy
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2006-4-16
结帖率:33.33%
已结贴  问题点数:10 回复次数:7 
关于USB上位机中断程序 急!
怎么使用中断响应!
 
BOOL WINAPI CH375SetIntRoutine(  // 设定中断服务程序
ULONG iIndex,  // 指定CH375设备序号
mPCH375_INT_ROUTINE iIntRoutine );  // 指定中断服务回调程序,为NULL则取消中断服务,否则在中断时调用该程序


BOOL WINAPI CH375ReadInter(  // 读取中断数据
ULONG iIndex,  // 指定CH375设备序号
PVOID oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的中断数据
PULONG ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
 
这个是原函数
我的意思 就是当下位机上传一个数据包后
就会产生一个中断 这时候因为CH375SetIntRoutine这个响应里面关联的一个回调函数
回调函数里面  读取数据!
 
不知道是不是这么回事!
可是这个函数我不会用!
 
搜索更多相关主题的帖子: USB 中断程序 
2010-10-09 14:05
lanshanlhy
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2006-4-16
得分:0 
没人顶 我自己顶 呵呵
请高手过来指点一下
我是菜鸟  不知道怎么办
目前做的程序原理:
上位机发送一个指令,下位机接受到指令后,发送3个数据包给上位机,
目前的读取方式,是手工单个读取,这样的方式不可取,
实质的实验中,发送指令后,会有源源不断的数据包发给上位机,每发一个就产生一个中断,所以我想读取数据时,在中断时把数据读取出来,这样才符合要求!

永远以今天为荣!
2010-10-09 14:11
lanshanlhy
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2006-4-16
得分:0 
typedef        VOID    ( CALLBACK    * mPCH375_INT_ROUTINE ) (  // 中断服务回调程序
    PUCHAR            iBuffer );  // 指向一个缓冲区,提供当前的中断特征数据


HANDLE    WINAPI    CH375OpenDevice(  // 打开CH375设备,返回句柄,出错则无效
    ULONG            iIndex );  // 指定CH375设备序号,0对应第一个设备,-1则自动搜索一个可以被打开的设备并返回序号


VOID    WINAPI    CH375CloseDevice(  // 关闭CH375设备
    ULONG            iIndex );  // 指定CH375设备序号


ULONG    WINAPI    CH375GetVersion( );  // 获得DLL版本号,返回版本号


ULONG    WINAPI    CH375DriverCommand(  // 直接传递命令给驱动程序,出错则返回0,否则返回数据长度
    ULONG            iIndex,  // 指定CH375设备序号,V1.6以上DLL也可以是设备打开后的句柄
    mPWIN32_COMMAND    ioCommand );  // 命令结构的指针
// 该程序在调用后返回数据长度,并且仍然返回命令结构,如果是读操作,则数据返回在命令结构中,
// 返回的数据长度在操作失败时为0,操作成功时为整个命令结构的长度,例如读一个字节,则返回mWIN32_COMMAND_HEAD+1,
// 命令结构在调用前,分别提供:管道号或者命令功能代码,存取数据的长度(可选),数据(可选)
// 命令结构在调用后,分别返回:操作状态代码,后续数据的长度(可选),
//   操作状态代码是由WINDOWS定义的代码,可以参考NTSTATUS.H,
//   后续数据的长度是指读操作返回的数据长度,数据存放在随后的缓冲区中,对于写操作一般为0


ULONG    WINAPI    CH375GetDrvVersion( );  // 获得驱动程序版本号,返回版本号,出错则返回0


BOOL    WINAPI    CH375ResetDevice(  // 复位USB设备
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375GetDeviceDescr(  // 读取设备描述符
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            oBuffer,  // 指向一个足够大的缓冲区,用于保存描述符
    PULONG            ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL    WINAPI    CH375GetConfigDescr(  // 读取配置描述符
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            oBuffer,  // 指向一个足够大的缓冲区,用于保存描述符
    PULONG            ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL    WINAPI    CH375SetIntRoutine(  // 设定中断服务程序
    ULONG            iIndex,  // 指定CH375设备序号
    mPCH375_INT_ROUTINE    iIntRoutine );  // 指定中断服务回调程序,为NULL则取消中断服务,否则在中断时调用该程序


BOOL    WINAPI    CH375ReadInter(  // 读取中断数据
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的中断数据
    PULONG            ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL    WINAPI    CH375AbortInter(  // 放弃中断数据读操作
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375ReadData(  // 读取数据块
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的数据
    PULONG            ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL    WINAPI    CH375AbortRead(  // 放弃数据块读操作
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375WriteData(  // 写出数据块
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            iBuffer,  // 指向一个缓冲区,放置准备写出的数据
    PULONG            ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL    WINAPI    CH375AbortWrite(  // 放弃数据块写操作
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375WriteRead(  // 先写出标准的数据块(命令),再读取标准的数据块(应答)
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            iBuffer,  // 指向一个缓冲区,放置准备写出的数据,长度不大于mCH375_PACKET_LENGTH
    PVOID            oBuffer,  // 指向一个足够大的缓冲区,长度不小于mCH375_PACKET_LENGTH,用于保存读取的数据
    PULONG            ioLength );  // 指向长度单元,不大于mCH375_PACKET_LENGTH,输入时为准备写出的长度,返回后为实际读取的长度


BOOL    WINAPI    CH375GetStatus(  // 通过CH375直接输入数据和状态
    ULONG            iIndex,  // 指定CH375设备序号
    PULONG            iStatus );  // 指向一个双字单元,用于保存状态数据
// 位7-位0对应CH375的D7-D0引脚,位9对应CH375的RXD#引脚,位10对应CH375的REQ#引脚


BOOL    WINAPI    CH375SetTimeout(  // 设置USB数据读写的超时
    ULONG            iIndex,  // 指定CH375设备序号
    ULONG            iWriteTimeout,  // 指定USB写出数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
    ULONG            iReadTimeout );  // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)


BOOL    WINAPI    CH375WriteAuxData(  // 写出辅助数据
    ULONG            iIndex,  // 指定CH375设备序号
    PVOID            iBuffer,  // 指向一个缓冲区,放置准备写出的数据
    PULONG            ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL    WINAPI    CH375SetExclusive(  // 设置独占使用当前CH375设备
    ULONG            iIndex,  // 指定CH375设备序号
    ULONG            iExclusive );  // 为0则设备可以共享使用,非0则独占使用


ULONG    WINAPI    CH375GetUsbID(  // 获取USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
    ULONG            iIndex );  // 指定CH375设备序号


PVOID    WINAPI    CH375GetDeviceName(  // 返回指向CH375设备名称的缓冲区,出错则返回NULL
    ULONG            iIndex );  // 指定CH375设备序号,0对应第一个设备


BOOL    WINAPI    CH375SetBufUpload(  // 设定内部缓冲上传模式
    ULONG            iIndex,  // 指定CH375设备序号,0对应第一个设备
    ULONG            iEnableOrClear );  // 为0则禁止内部缓冲上传模式,使用直接上传,非0则启用内部缓冲上传模式并清除缓冲区中的已有数据
// 如果启用内部缓冲上传模式,那么CH375驱动程序创建线程自动接收USB上传数据到内部缓冲区,同时清除缓冲区中的已有数据,当应用程序调用CH375ReadData后将立即返回缓冲区中的已有数据


LONG    WINAPI    CH375QueryBufUpload(  // 查询内部上传缓冲区中的已有数据包个数,成功返回数据包个数,出错返回-1
    ULONG            iIndex );  // 指定CH375设备序号,0对应第一个设备


BOOL    WINAPI    CH375SetBufDownload(  // 设定内部缓冲下传模式
    ULONG            iIndex,  // 指定CH375设备序号,0对应第一个设备
    ULONG            iEnableOrClear );  // 为0则禁止内部缓冲下传模式,使用直接下传,非0则启用内部缓冲下传模式并清除缓冲区中的已有数据
// 如果启用内部缓冲下传模式,那么当应用程序调用CH375WriteData后将仅仅是将USB下传数据放到内部缓冲区并立即返回,而由CH375驱动程序创建的线程自动发送直到完毕


LONG    WINAPI    CH375QueryBufDownload(  // 查询内部下传缓冲区中的剩余数据包个数(尚未发送),成功返回数据包个数,出错返回-1
    ULONG            iIndex );  // 指定CH375设备序号,0对应第一个设备


BOOL    WINAPI    CH375ResetInter(  // 复位中断数据读操作
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375ResetAux(  // 复位辅助数据写操作
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375ResetRead(  // 复位数据块读操作
    ULONG            iIndex );  // 指定CH375设备序号


BOOL    WINAPI    CH375ResetWrite(  // 复位数据块写操作
    ULONG            iIndex );  // 指定CH375设备序号


typedef        VOID    ( CALLBACK    * mPCH375_NOTIFY_ROUTINE ) (  // 设备事件通知回调程序
    ULONG            iEventStatus );  // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件

永远以今天为荣!
2010-10-09 16:38
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
得分:0 
只有头文件和lib库吗?
根据要求直接用呗,按照需要获取你当前程序的参数信息 传过去不就行了!?
还是你自己需要写函数实现?!
2010-10-09 20:13
lanshanlhy
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2006-4-16
得分:0 
楼上的哥们!
还请你帮看看!
要不你留下QQ 或电话
我联系你
我实在是没辙
那函数一写上 老说参数不对
我也不知道该怎么用!
我QQ 258308681 TEL:15112506475

永远以今天为荣!
2010-10-10 22:44
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
得分:10 
1015558947
参数类型不对 还是其他什么原因 ?!
错误输出信息呢!

[ 本帖最后由 hahayezhe 于 2010-10-11 08:45 编辑 ]
2010-10-11 08:43
lanshanlhy
Rank: 1
等 级:新手上路
帖 子:130
专家分:0
注 册:2006-4-16
得分:0 
我把答案贴出来 方便后来人把
使用线程监视(使用一个循环)大致意思:
while(true)
{
   监测接受缓冲区代码
}

永远以今天为荣!
2010-10-15 08:13
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
typedef        VOID    ( CALLBACK    * mPCH375_NOTIFY_ROUTINE ) (  // 设备事件通知回调程序
    ULONG            iEventStatus );  // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件

把你下面的关键是事件定义贴出来,看看有没有诸如 X = 数据到达事件 它才是你是否能实时读取的关键。

BTW:
你现在的这种循环读取方式仍然是低效率的。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-10-15 08:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-322346-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022951 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved