|
看到这样一个usb通讯的帖子,可能对你有用! 主 题: 关于usb通讯方面的问题。请AKing大哥及相关高手来看看,万分感激!!! * E0 J$ }. q; F
作 者: aiyu33 () ( N& O6 A; e$ ^* ?
等 级: 4 n& K! ?* q4 A% l: B* ~
信 誉 值: 100
F! }8 s& U4 v9 k, J所属论坛: C++ Builder Windows SDK/API - j$ w8 [# i+ O9 ~: D- I
问题点数: 100 ' t- c# s# Z2 u' D2 F" v/ g! t' a; o
回复次数: 12 , Z) }# a/ }7 t' P& B
发表时间: 2003-12-16 20:43:13 9 O) |4 l7 }% L o) Q
8 \4 ~3 k+ |2 S/ e; }. Q
# M- T6 }* d8 E9 h' ^
最今我接到了开发pc和pocket pc通过usb口通讯的任务。这两个星期我参考了很多方面的资料,特别是AKing大哥写的一些文章。但我始终没有打通这个关口,我贴出我的代码请AKing大哥看看,现在很急,多谢。% d$ \+ C( }# G: f" N: Y$ Q: \6 a
pc的os是windows2000professional
0 L7 |% R0 c dpocket pc是hp ipaq 2210,os 是pocket pc2003。7 v+ F$ k# F. q; k2 n. M: |
我装了activesync3.7。我查看过了,这个activesync目录下有pocket pc的驱动程序。pc也能识别。
- H& Q) d% V0 Z6 q) u# E% K下面是我在pc上调用usb的代码。) Q" s- C; ?9 g& g( h7 u
下面的代码我能打开hidn类型的usb,但是就是不能打开pocket pc的usb。
' v5 s8 B; `/ e! s. g0 a# D7 m; d* r3 {//classGuid = {25dbce51-6c8f-4a72-8a6d-b54c2b4fc835}
6 }! b: `3 M: U. M0 I4 VDEFINE_GUID(GUID_CLASS_PALM, - { M4 C7 p, _) J1 L( [
0x25dbce51, 0x6c8f, 0x4a72, 0x8a, 0x6d, 0xb5, 0x4c, 0x2b, 7 `, g) P' t4 z$ Y& v' m. X* y- p
0x4f, 0xc8, 0x35); q9 Q7 ~6 q2 x. w. `
GUID HidGuid = GUID_CLASS_PALM;
1 s2 q* W9 T1 [/ Z2 j! D- j/ y6 CHANDLE Get_DeviceHandle( GUID* pGuid)
: b L: x3 U5 C{) U8 [. r4 G! I- y
1 h7 ~, G& }7 p! _1 _
HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
2 S% S: Y* v% w
/ {: C# U2 V1 ?% p, G: D/ [, \ if(info==INVALID_HANDLE_VALUE)
2 j9 ^ ` F7 l4 \0 R {
: s9 v0 N3 Y, s; P! T printf("No HDEVINFO available for this GUID\n");
& q u+ J. V9 P* t: J return NULL;2 Y, [+ s6 l. k0 W3 s
}3 D, Y$ B4 Q: d- B2 Q& e
SP_INTERFACE_DEVICE_DATA ifdata;( Q, }/ s. |5 L6 }/ V q# x
ifdata.cbSize = sizeof(ifdata);# g. n! a! N( e, L" ]4 m) A' Z
//0000是我在注册表中找到的序号
8 _* F! M! M- g% w if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, 0000, &ifdata)): @+ n$ h+ l) _
{
2 k3 t) G8 V1 p( P- W printf("No SP_INTERFACE_DEVICE_DATA available for this GUID instance %d \n", instance+1);
% ^7 V! g7 L0 e E5 d( O" X SetupDiDestroyDeviceInfoList(info);
" u. v4 a2 l& e _2 W return NULL;
) G5 D9 C+ @$ h, Z! k$ s } // Get size of symbolic link name2 x" U; B* C( R
DWORD ReqLen;
; M: t. a) a' J9 n
, X/ U& F- a' b# M' S: f3 x SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);: r& S+ c! `6 O
0 O& d; g- U- M, \4 Q PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
8 t8 y! Y3 G2 z% |+ x1 O' } - Z' Z4 O, c2 \* B
if( ifDetail==NULL)' Y* s# e& o* l4 [; n/ ]" |( K
{2 }8 i o7 p3 s& C
SetupDiDestroyDeviceInfoList(info);
5 o/ V6 V1 p- `2 R; F2 ~( O return NULL;* _; `& v; s* ^$ }
} // Get symbolic link name5 C5 H: W' f; E! C, f
ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
) N7 _7 z; Y7 Q/ Z % ~+ D# V2 o) l. s" p/ ~
if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL))
( Z! M( ]0 R, [ {8 ^4 r+ }# }7 B, L7 U" j1 M- l
SetupDiDestroyDeviceInfoList(info);
' ^7 P4 a4 { z' l% A' R9 m delete ifDetail; |8 @1 S; K. b6 W! L
return NULL; / g. |6 u# Z4 A0 E& z, [5 H2 H6 m0 d1 K7 B
} printf("Symbolic link is %s\n",ifDetail->DevicePath);
$ b# G4 F- v: [) S* b% ~ /*\\?\\usb#vid_03f0&pid_1016#5&1bc41f6c&0&1#{25DBCE51-6C8F-4A72-8A6D-B54C2B4FC835}这是ifDetail->DevicePath的内容*/. v: x0 p1 G/ f# B1 ]
// Open file
! z6 ?( B K+ p2 a//前面都很正常但就是下面始终得出一个无效的句柄,我也就无法开展下一步的工作., n& `: Q( `1 G, e- b4 F# r0 x
HANDLE pDevice = CreateFile(
7 K8 a0 g t: _. ^6 D# d3 E8 L, C ifDetail->DevicePath,
5 j. J& s) F9 K2 R# M5 c3 r GENERIC_READ | GENERIC_WRITE,
$ _/ O( U0 m5 A7 q1 r$ A FILE_SHARE_READ | FILE_SHARE_WRITE,! |# e; k X9 F/ U+ w
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
) y3 |0 Z6 `% r4 B% D - ~. w8 U3 e+ }- r
if( pDevice==INVALID_HANDLE_VALUE) pDevice = NULL;
; |9 F3 l. I7 A$ H# ~$ @1 ]9 c SetupDiDestroyDeviceInfoList(info);
/ O, m }$ X- K- ]9 B% d
0 M; x/ N/ \9 x1 z' @ return pDevice;" c# t+ e. z e0 g& C% I
} n, s9 Z$ |2 N# i, }: B
再次感谢关注这个问题的人们。 % _; L% X) x5 f# }0 B: k+ T, k
; z# d3 X& i v5 N( ?
( t( C" s/ w* F 回复人: constantine(飘遥的安吉儿) ( ) 信誉:101 2003-12-16 21:23:57 得分:0
% _& N, T j( {) @- l) F " w5 {5 Z. u9 A: c& T7 [
4 L* x5 G9 [# q2 R* J
5 g; s3 V/ _* D/ Z7 ]study . i/ ?+ e, ?# h4 y( @
3 }) C. ]- v% l$ t4 YTop - `! Y" j C' u4 ^0 I
: E0 p( F7 M8 T! D% d' M1 I 回复人: wenyongjie(一个想成为大鸟的小菜鸟) ( ) 信誉:95 2003-12-16 22:28:46 得分:0 ( C+ A/ E' v) y& H/ f( X% k
: R( ?: q( E# q# h* }
8 u _. V1 ^9 l
0 m6 o& h$ @! d H' K
只有学习的份 & g6 q8 |/ w8 }9 l6 c% G
2 p0 X4 `7 l$ v% G! l( V% j# QTop % n* O+ w. D. [2 x# Q* V. O, N
6 O, I6 n# O6 K/ e' d" y& r6 u* w; C 回复人: HUANG_JH(保卫钓鱼岛) ( ) 信誉:115 2003-12-17 9:50:41 得分:10 3 B, b3 [% E0 d& M9 ?" l1 c
: p; K1 D' Y+ @( l
# h |& b( r @
% V& R+ M: J* y2 q k+ I不知道有没有用! ///////////////////////////////////////////////////////////////
3 Z* r4 k4 a+ G+ v// HW9911 evaluation board software Rev. 1.0& \9 ^8 D& n$ }$ D* M
// program by Liu Ding, Bei Jing HEAD Elec.
- f6 G, P5 F& l3 N+ J" m$ S# a// this is the main program for the HW9911 USB device evaluation board# Q4 O- |, e- v' E& V# o
// it illustrate the basical read/write process of HW9911
, o1 _# T3 W) w2 m6 W& t// by three examples:
, o" F+ v' [" S0 K8 e" K// 1. write datas to ram on the evaluation board- x8 N& {; s. v+ n( C0 l
// 2. read the datas from the ram on the board
- p4 d9 _0 r6 G// 3. send datas through RS-232 serial prot on the board/ C$ f0 j( t' l$ F$ |. X: @0 \6 P
// ) j! v$ }5 p5 z5 t
// the whole project are build with MSVC 6.0! L* l( @# O2 M# I3 [
// and tested on windows 98 platform.
|6 U. B/ ]4 n2 q4 f6 m: [/ o//
2 Y% _& {0 Y" ]1 u. V// notes: you can use hyper terminal to reaceive datas form RS232 port3 S" F; k h# d5 d H2 v$ P
//1 c& g% E% P5 @0 V; c2 {) }
// this software are designed by Liu Ding
- v- S$ m( x7 H+ N, w% W// if you meet any problems, pls contact by email:
1 C: R* z: E/ V6 K// hugehard@263.net/ \& p( A9 H( M3 t
// or contact HEAD Co. by Tel 86-10-87312497* a" Z) \# L+ M8 N4 Q# n
// or by fax: 86-10-87312495
) c$ q! ]$ b0 @9 L3 y. S/////////////////////////////////////////////////////////////// #include "hwdll.h"
7 r9 D* X5 p% A& i#include "stdafx.h"
$ ?- c: F% |3 X3 O6 b#include <stdio.h>! S0 T! c& m, {3 |* B5 X
#include <windows.h>
. x ? _4 ]' m& Q) l- W a#include <memory.h>
5 D4 R( d7 z. ]) i#include <DEVIOCTL.H>7 h# x" o0 p* l: x* Q" U" Z
#include <stdlib.h>* G/ {3 L7 P) E& g5 f7 K- J
#include <conio.h>( g5 Z5 e6 M7 E. X1 J( h) F1 o
#include "hw9911.h"- O7 ~) }* }$ u y
#include "test9911.h" 8 C2 t# U. C& S1 ^7 u
int main()( F+ B! s6 b, A$ N/ z* `
{
) a0 q- c& P* _9 Z+ o. |5 ^ int hOpen=FALSE;
) l( V" H1 [) Y int hCommandLength=32;6 E, N( w. X5 n, `: Z
int hDataLength=64;6 D6 @9 T ]& a& [
int i,VertAddr=0,HorAddr=0;
2 C& m) ]1 n4 A5 N1 D int addr,TotalLen;9 I" v3 v6 u9 x+ N& g
USC StAddrH=0,StAddrL=0;! k' V+ B2 h! O) L3 X( m- \8 k. D
USC DataLenH,DataLenL;
8 o, _0 }) i! ?5 Q" g5 }1 z, U4 x# r3 U, k USC *hDataBuffer,*hCommandBuffer;
/ J- m& q% f. C6 E9 q& Y USC ch1=0x61;
4 S- o0 L: S3 ?; F HANDLE hDeviceHandle;& x8 W& h |1 B9 ~! I
; f7 C) ~% W: s1 C" ~
printf("************************************************\n");
2 n( I8 V8 x; g/ c9 D printf("*******HW9911 USB DEVELOPMENT BOARD*************\n");
- h, J2 ]6 Z( M2 k printf("************************************************\n\n");
* n1 d5 a) d0 Q# l/ K# x, n# k& u printf("now press any key to open board\n");" b6 J- u) n, @8 K& \* Z
getch(); /********* call hDeviceOpen in hwdll.dll to open the board***/" N9 |6 l! B5 v( g( c" v b
//hOpenDevice 说明:
4 b* Q! |1 {9 Q3 B5 j& n, j6 h// BOOL hOpenDevice(HANDLE *DeviceHandle)* t# O o0 s: V4 Z$ b4 X8 z, z0 T
// 作用:打开设备7 o) u5 Q. Q: X% w/ O
// 参数说明:
! M* W4 z9 \ }% ^1 k. g6 p8 Y// DeviceHandle:设备句柄
" N% s/ g. O. L1 j9 ^5 N// 返回值:
1 b' \1 @6 w+ @' }' ?3 M% l- O8 \// 设备打开成功返回 TRUE,失败则返回FALSE
0 d1 _+ o* m4 U) D* ~3 ]- a, z if( (hOpen = hOpenDevice( &hDeviceHandle ))==FALSE)6 Q$ S2 f1 }" v& y
{
% G1 r/ G4 O. x' I' h printf("can't open device\n");, x" E0 o4 F. K9 b+ x* ^# k
printf("press any key to exit\n");) Q: \. i3 |" \8 X) @, O+ ~( S
getch();, o! X; p, I# S# l& T b
return 0;
$ F X' |1 i- r/ T }
" F* q% W/ x" c% ^ else . {$ O1 @* G' j
printf("\nCongratulations! device opened!\n\n"); /****** build and send command **********/
, g* h4 M) S* Y( t( A/ O' L4 R printf("how many bytes do you want to access?");
& M6 e4 \" v( j, y, U7 y scanf("%x",&TotalLen);; {/ @7 y4 d5 k( Q
while(TotalLen > 0x7fff)
; W6 o3 s% K. H4 h {& H- [" j' _. S
printf("pls input a hex data less than 08000\n");7 X- [0 H* P" Z4 d! _/ x) _6 f
scanf("%x",&TotalLen);
- ^: R& z9 D$ o U }
4 S# q6 }$ m6 l2 G( f3 X DataLenH=(USC)(TotalLen/0x100); //data length high bytes
; ?4 [- e' V I DataLenL=(USC)(TotalLen%0x100); //data length low bytes printf("************************************************\n");/ B2 J$ T A2 V+ ]
printf("now program will write datas to ram on board\n");
0 ~2 a* J. X2 K( ?' {% x) C printf("total bytes of datas is %x\n",TotalLen);; p' m. L) m% ~$ x
printf("press any key to continue\n\n");
6 P1 ^1 F. \8 r- o$ F7 r7 f getch();
4 J* e0 r6 S$ C& p% L6 G2 |/*****************************************************************0 C9 q3 R: C0 A* u6 V& w+ w
now will build a write command packet
& z5 \4 a8 T! u" O! ] with the first byte is 'w'.' m- @: h7 g0 r9 R( S" s1 h
and the following bytes are:
) Z) c1 V# a7 c start ram address byte high, start ram address byte low,% ?0 n4 l e3 D3 V
datalength byte high, data length byte low.1 C! B$ U! N" I0 w$ q
this packet will send to device through WritePipe1,
$ ~. X; W+ w/ d which is endpoint 2 of HW9911.
8 c+ @8 u5 l: Z) S0 _ when the device receive this command packet,% b. e) m$ @! o* b/ w
it will write TotalLen bytes data to Ram on the board
b0 E) }* l/ T; k0 Y* ~0 M8 ?( y******************************************************************/
5 f2 o( ]9 c2 P! m hCommandBuffer=(USC *)malloc(hCommandLength);5 H; \, ]$ u- S/ _' u
hDataBuffer=(USC *)malloc(hDataLength);
' C! o1 X/ w2 O hCommandBuffer[0] = 'w'; //read command* }6 @. b' C% x* n
hCommandBuffer[1] = StAddrH; ! ]; d/ [! F8 a6 d
hCommandBuffer[2] = StAddrL;
% l7 n# b* y, K6 G9 ]. L hCommandBuffer[3] = DataLenH;) h; t! @5 ~5 l, x# v( k: r
hCommandBuffer[4] = DataLenL; /* call hUSBIO() in hwdll.dll to send command packet to device*/
5 `0 C$ X- I, E( N4 j) U// hUSBIO 说明:, ^ G$ t0 ~( @
// BOOL hOpenDevice(HANDLE *DeviceHandle, [+ { }' G* S
// unsigned char *IOBuffer,
2 }2 ?) s- x$ W0 a// int BufferLength,
% J$ o$ x( k1 r8 v" x' {6 F// int PipeNumber,: I1 d5 P( c7 c/ P9 J: F: [# |
// int Action). b$ K& T1 B0 j
// 作用:设备读写% }6 I( i4 S& r4 X% b# g
// 参数说明:
0 D7 E" @/ j4 a+ j// DeviceHandle:设备句柄
. V9 o: J4 C* q( A% c// IOBuffer: 指向要传送的数据指针2 C" k" T6 t2 A q5 M# T1 o
// BufferLength: 数据包长度
4 ^. R+ _" w/ R: M// 对于发送缓存1、2和接收缓存1、2,BufferLength必须小于或等于32; c, P, a" [$ m: L6 M
// 对于发送缓存3和接收缓存3,BufferLength必须小于或等于64/ c% H: q& F* K. M/ ~/ _! b e
// PipeNumber: 通道号
% E+ p5 [1 N" a; {3 {// 发送缓存1:PipeNumber=0;; u% A( b! Z {7 F7 ]
// 接收缓存1:PipeNumber=1;
2 q( x- |) D7 a// 发送缓存3:PipeNumber=2;' |2 A: d2 _" n8 g C* ~% \) ]+ h
// 接收缓存3:PipeNumber=3;
: h+ p6 n% I( o& M// Action: 读写标志。TRUE代表从设备读数据到主机
! Y$ U/ c, v+ C V9 `% v/ O// FALSE代表从主机发送数据到设备
! O/ P( _$ F7 S* d' {! y* X6 Q// 操作接收缓存,Action必须为FALSE R4 A3 e. K+ p! H. d3 t6 P* X
// 操作发送缓存,Action必须为TRUE4 p0 g+ L( N) a" B
// 返回值:
# E h! U9 Z# _6 k, H// 操作成功返回TRUE,失败返回FALSE if ( hUSBIO( &hDeviceHandle,2 t, i+ u4 {. l* U8 f5 C& n3 p
hCommandBuffer,
( S& P# P) W3 c2 M/ i$ |" J) ~ hCommandLength,
; o; k. L# i- S- k' ^ hWritePipe1,5 R; A7 b' t9 C
FALSE) == TRUE)- x2 _( }+ x/ q' d$ s4 M# X" F. x
{/ O* {! ?7 v( g& w
printf("command 'w' writed to board\n");
, g1 u( I0 ^. M printf("now press any key to write datas to ram\n");0 Z( m4 ^1 h- U D, e% N- j
getch();( L+ L' n! s& S5 A
}) y1 c" i" k E8 M
else0 _2 c6 B. r. F! D- B
printf("data can't write to device\n"); /******** write ram data to board **********/ printf(" ");* N9 ^- d ]( Q% B' h7 _7 m% t9 X
for(VertAddr=0;VertAddr<=0xf;VertAddr++)
6 J) T/ @1 S' A9 V$ h printf("%02x ",VertAddr);) M7 F" ?( @+ k
printf("\n");
6 {; a7 R5 L7 y. f- B; ` addr=0;
{4 V, K1 X1 G6 \+ r while (addr<TotalLen)& B9 q/ r% a% L6 ~. r0 v3 a7 [
{
5 |/ ?8 Z9 n- }; z; ^: n; P if (addr+hDataLength > TotalLen)
+ A9 Y# \& }, u; ^4 v0 {: T hDataLength = TotalLen-addr;6 Y! u9 M& T# C& }
for(i=0;i<hDataLength;i++), d; i0 z+ X* G. W2 B: n
{, O$ S3 e; a6 b3 L( ?( {
hDataBuffer=ch1++;
6 c) j8 a# P& P3 z+ g if (ch1 > 0x80)
' S5 h9 f% b/ o' i1 J$ a ch1 = 0x61;3 \5 H0 P- @% l' [- p
}0 u8 i3 v% [2 d& P. w3 r A' v
/* call hUSBIO to write datas to write pipe3, which0 h6 y. w5 ^- W
is endoint 6 of HW9911*/ if ( hUSBIO( &hDeviceHandle,
& @+ I% p* {# w2 f- J hDataBuffer,6 S% S ]# K" C$ ]! `5 s
hDataLength,+ O& t" m/ f9 W/ U& m1 P% V: S
hWritePipe3,
% L( X d# s) s/ ~5 j, t" P0 @/ T FALSE) == TRUE) //FALSE means Write operate
& b. E4 a/ a* c6 ^6 E/ S" K! G2 k! {$ _ {
$ q f" f9 j/ D" w( b! {# Q for(i=0;i<hDataLength;i++): h) b* Q3 l) M$ r. n) T( Q. A
{
& g' s1 a6 N$ ^5 r! [/* print format control */ , m, O, C% O3 v6 V
if(i % 16 == 0) 9 P% F$ i! m5 W( u% Z
{
8 N, s, G8 h1 a6 z printf("\n%04x ",HorAddr);- x: ]6 T9 B! _/ |3 Z
HorAddr=HorAddr+16;
; {% ]9 m9 K) G$ }3 w/ V }9 y- S/ W8 y) z o8 T" o9 Y
printf("%02x ",(USC)hDataBuffer);
- n3 L" d* Q3 B }( Q& W# l2 d; r9 e, b
addr=addr+hDataLength;( W3 }$ R5 \, J; w
}2 u4 M9 A# G4 Q8 ~6 }0 p( @6 ~
else
6 n8 \- f7 F$ J9 O) D8 f {7 B. x, j$ `$ _
printf("can't write to board\n");
( _. c9 z9 F. _# X/ @ exit(0);! C4 w: Q3 b g) ~! W$ f
}6 ], J" @; L' G
}% O& S) q N9 g+ e+ E5 Y$ U
printf("\n\nTotal%x bytes write to ram OK\n\n",TotalLen);
# N2 @6 O" |: h
- V9 V& F* t( {% |; KTop
7 L6 K) D$ w2 q9 @' V
0 C/ t8 J5 C- I, O1 W 回复人: HUANG_JH(保卫钓鱼岛) ( ) 信誉:115 2003-12-17 9:50:51 得分:0 # K. `9 e$ C: O5 ]9 [& \# y: J
# N9 j: T0 H9 X( Y0 q- P" M/ a
. c4 m. B0 S( F; Y- \; }4 U; D" B /*****************************************************************
. R \/ e9 H" T& [3 ] now will build a read command packet $ {5 m" }1 H$ j( i# i
with the first byte is 'R'.# K. S+ r% i" N! h; J" Z3 `
and the following bytes are:2 L) N7 F% ]* L2 J' ?# j; A
start ram address byte high, start ram address byte low,
) |9 t, m# I: Z7 ?; }+ V; | datalength byte high, data length byte low.- x! \0 {; Z( y: ?
this packet will send to device through WritePipe1,
n4 d/ R! ?% h! A/ T- a which is endpoint 2 of HW9911.9 o! Z5 g' y0 ]' p% Z
when the device receive this command packet,2 ?: Q& F! A1 l% b
it will read TotalLen bytes data from Ram on the board
. Y" o$ {5 P# a, h/ y6 v2 L0 T******************************************************************/ printf("************************************************\n");
) [- P3 N$ J% v: v, G5 R# }, L printf("now program will read datas from ram on board\n");
C/ v5 K1 b3 E! o printf("total bytes of datas is %x\n",TotalLen);
$ ~% V# t5 H' ]2 g printf("press any key to continue\n\n");
3 o4 e% i* D0 z( o+ f9 @- `1 p getch();9 i( A& g( c' ~* ?; \% @& E
hDataLength=64;# Q; ~3 H3 ?( z
hCommandBuffer[0] = 'r'; //read command: y9 m. v# Y T) E0 f; }+ w* X
hCommandBuffer[1] = StAddrH; # ]- t9 ~/ i. m: B/ ~0 B
hCommandBuffer[2] = StAddrL; & C) [; F5 L1 j/ @1 [
hCommandBuffer[3] = DataLenH;5 u- b; S; h8 o; X* Q
hCommandBuffer[4] = DataLenL; + a! k) v8 C/ L( s7 E$ F8 W' ]& l
/* call hUSBIO to send packet */+ N( y% P3 h0 S: J2 {# J/ `
if ( hUSBIO( &hDeviceHandle,
8 M2 T# X4 H7 f* E1 D, I, l hCommandBuffer," V1 O) Y ?6 [' T) a E
hCommandLength,
" O) K) y7 l: P hWritePipe1,8 [8 s/ ?' y- k- Y
FALSE) == TRUE)
% D3 E, b; J) _& U W) @ {1 R' m/ e! f/ K- d! A. E0 g$ O
printf("command 'r' writed to board\n");) h7 w+ }/ ~; h+ P; |
printf("now press any key to read datas from ram\n\n");
7 C$ q5 i' ~, Q) @# z0 } getch();2 D! A+ s9 k, U6 |# v* S9 r
}7 m, s: L9 G; n* K
else8 g, K& _7 O, u
printf("data can't write to device\n"); /******** read ram data form board **********/
( a) Q" k& k* L; [" M. \% e1 K! R printf(" ");
4 O: o* `) ?9 u( f U/ L" ? for(VertAddr=0;VertAddr<=0xf;VertAddr++)- h7 E0 K0 O! [
printf("%02x ",VertAddr);/ k: \4 u$ d. P) _2 L# E% V
printf("\n");2 N! s$ P+ {& L' B% u$ F' W
addr=0;4 W% ^' C) _7 D' h* J
HorAddr=0;# t1 _+ k) X7 J, L1 G$ |+ }
while (addr<TotalLen). G" x g; H5 s' I: s+ l' `+ R
{
' u' Z3 P$ f/ c Z4 y4 F if (addr+hDataLength > TotalLen)
& F- n5 n$ K- h' a* Q( L hDataLength = TotalLen-addr;6 f* @4 U5 D& p5 r
/* call hUSBIO to read datas from board */
. \( h+ N1 e* Y* }5 a6 o if ( hUSBIO( &hDeviceHandle,, q% i5 x, }9 H% a- v* @
hDataBuffer,. q' k4 g/ B- A4 Y
hDataLength,
* N y5 W# C# b* P hReadPipe3,
: t: a$ G- {) E" N! g TRUE) == TRUE) //TRUE means Read Operate7 z* ]! t+ f+ H8 W+ g
{( }" P" X% M% i6 N5 f! Z
for(i=0;i<hDataLength;i++). P W& C6 I4 F5 Q) w9 v
{
) x$ q, T% w3 A1 G/* print format control */+ C, n* o$ `2 ?
if(i % 16 == 0) & q5 d) Z" E3 F+ w" C
{
1 N* [( O% A* ^7 Q3 @ printf("\n%04x ",HorAddr);$ H4 J( C" y g
HorAddr=HorAddr+16;5 i$ Z: X, [8 J+ ?
}/ H# a6 l9 l( q$ R! J
printf("%02x ",(USC)hDataBuffer);
{0 U7 b% F0 l& l$ w# ^ }; D. l8 h7 A; G: r6 Y* |/ B
addr=addr+hDataLength;* q7 J8 n+ Z: B& Z$ P$ N
}$ ?0 f5 X7 W* a
else
0 r' P r" U; C# S" g+ \ {# f+ E z- J, ?5 ~9 j
printf("can't read from board\n");' }' i a8 f8 d) A- A
exit(0);
$ r6 t8 h% t8 _: D3 e/ t4 U }. n" n" B1 G7 V& i6 \
}7 E* X: A9 X9 i& M) _! a# c: a
printf("\n\n");
- y- W( Z& a! M) W# K8 k9 [ printf("%x bytes read from ram OK\n\n",TotalLen); /*****************************************************/
. s# J1 \; v/ K$ U% e/* process rs232 test */
) j0 \8 C1 H! O8 \% b* x/* the first byte in this packet is command 's' */1 t5 q8 j. T$ c0 Z
/* and the following 2 bytes are used to set */
- ~+ k: t1 x& F3 |/* the baud rate of 8051 */( q6 m5 u9 f8 k3 Y) B
/* they will be write to TH1 and TL1 respectively*/
8 m3 p8 c( D$ ]. ^; L3 f; p( E/* the following bytes are datas will be */
4 F0 e6 s, z9 F1 ~2 L9 Y# V/* send through RS232 serial poart */& l: p7 r% S; O
/*****************************************************/
' l }: y: j! Y' Q+ v! A. x printf("\npress any key to process RS232 Test\n");, O9 V: E: T7 n+ ]# |
getch();. O2 I+ Z4 K( w9 D( X
i* M/ x, d% B, W) [5 s
USC TH1,TL1;" K( g ~4 S, z. l% \0 w
char hStr[30];
* j7 h- c0 w3 l2 J% S2 X; C TH1=(USC)(BD9600/0x100);
) d. _) {% G4 o2 Q; B TL1=(USC)(BD9600%0x100);; o% R9 {6 J( K* H' U2 ^% y) Z7 E
hCommandBuffer[0] = 's'; //read command8 M' P& R1 _( a/ z; M1 _% i7 r
hCommandBuffer[1] = TH1;
2 H5 J( Y' X$ [ u; f hCommandBuffer[2] = TL1; //start address is 0x0000 strcpy(hStr, "Hi, dear HW9911 consumers! ");4 K$ G; u* \; h5 Q" w
printf("Hi, dear HW9911 consumers! ");. r; ^: m/ e+ o6 [+ V4 |) |& w% S
memcpy(&(hCommandBuffer[3]),hStr,27); if ( hUSBIO( &hDeviceHandle,
Q) z8 N4 C9 `& o0 S5 B hCommandBuffer,
; g8 ^0 m0 C6 |: V: ]- ~2 g 30,
$ B2 z" b1 h) X6 Y' S hWritePipe1,
# V1 x9 x D! H FALSE) == FALSE)2 P1 i7 |; A) _2 T- G# H
{
. v5 Q7 _1 k; n S6 E8 F; v. | printf("can't write datas to RS232\n");$ J) F! Q& H# K; @ f; `; Z. k3 e
exit(0);) }5 m2 ]: `( M6 ]9 `% w* m5 p
} strcpy(hStr, "I'm HW9911 Evaluation Board, ");
* `/ [$ h3 R3 z ~7 b6 H printf("I'm HW9911 Evaluation Board, ");
5 C" L! g9 C, K2 c5 U memcpy(&(hCommandBuffer[3]),hStr,29);
5 }- |0 `: V# B$ ]; Q0 T& i) W / } C# W* `6 o: p" q+ Q2 l# B
if ( hUSBIO( &hDeviceHandle,
) m, N; ]# e8 n) N hCommandBuffer,
I' }$ i- O* b% v$ l* e3 d 32,
/ Y' C* y! S' N3 h. G# K7 f hWritePipe1,
$ r* p. l6 z% Y# T8 U FALSE) == FALSE)
|# J6 ~ F8 W! ^, u* B {
: \9 p% t% R/ x% o2 \0 o printf("can't write datas to RS232\n");; e& h: r6 K: D, I2 O$ D
exit(0);
' B; S" C/ j0 u) D } strcpy(hStr, "thanks for purchasing me, ");
4 l& @/ N1 y. E printf("thanks for purchasing me, ");; a" k8 `2 L( f: r, U
memcpy(&(hCommandBuffer[3]),hStr,26);
' ~; @8 {" m& e
7 h/ a6 g# b$ \0 O2 \/ f if ( hUSBIO( &hDeviceHandle,9 c+ r+ H& O2 G' z4 R; ?) s
hCommandBuffer,) B, u1 K- D6 w4 x7 @* ?
29,4 j: \8 x8 j. V7 _8 H' Y5 Y4 Z0 U4 v
hWritePipe1," P" M" b. D9 b) ]/ p5 H
FALSE) == FALSE)% M# K2 Z9 N9 X' C
{
/ ^$ ?$ S- w; i, x* ^( X printf("can't write datas to RS232\n");+ V9 Z- h3 F6 w) @% \
exit(0);
5 _3 V7 e5 c/ `# a. g7 o }
% O/ I4 D' @$ Z1 P 4 a! M$ a7 v- S% x& o
strcpy(hStr, "If you meet some problems, ");
6 U% |9 g' i4 B- i9 f printf(hStr, "If you meet some problems, ");4 L7 Q# x7 S/ j
memcpy(&(hCommandBuffer[3]),hStr,27);
- {1 C3 g" o/ l
6 Q4 Y. x( a4 W' v5 L( ~# W( Y if ( hUSBIO( &hDeviceHandle,
/ @% I* S6 J* O# @1 E1 G! `; S( j hCommandBuffer,# I+ C0 x4 J6 l# f
30,* s. g& e5 m" k6 j
hWritePipe1,, K; b1 c( g: x- X5 n& Z
FALSE) == FALSE); Q: [$ B: P) K# }1 n3 S3 m
{, _+ R: `: Y t+ q
printf("can't write datas to RS232\n");
8 ?8 @; [7 n$ a0 k exit(0);9 G3 F' R4 [5 u
} strcpy(hStr, "pls contact my designer ");
/ O3 h4 ?; ^! e* J printf("pls contact my designer ");
0 V% I6 U: }8 v: \% O b memcpy(&(hCommandBuffer[3]),hStr,24);
' E' y: W% k- I' }4 ^6 y 6 F# d- Q* }% X. f" |
if ( hUSBIO( &hDeviceHandle,
. p1 `( U: p8 ?. s; K, S( } hCommandBuffer,( J# E0 D1 g: q8 a& P* L
27,) p8 e# w5 Q: }# y& v* h# ]9 j
hWritePipe1,* k9 S: A2 j6 h% J7 y3 a. c
FALSE) == FALSE)
$ L8 N; A# ~. b {. ~) f4 b: ]4 I9 q) c3 o9 [5 w9 |% @
printf("can't write datas to RS232\n");8 m. s, b4 K3 V0 o( p; P& a
exit(0);
w) ^7 K. P* ?( w } strcpy(hStr, "by email: hugehard@263.net.");
5 r7 }' V% j. Y6 H+ Y) c printf("by email: hugehard@263.net.\n");5 m9 `" X( Y/ {. `
memcpy(&(hCommandBuffer[3]),hStr,27);! l# A( U G, ]. n) ]* F
! z* G, X+ ?& T if ( hUSBIO( &hDeviceHandle,
0 t& F2 \ j; E hCommandBuffer,( T/ e: f( @0 j3 n7 K9 o' l$ I
30,# A( n! E3 X- k/ r/ i8 E
hWritePipe1,
' d6 _: }% F1 _0 V FALSE) == FALSE)/ X% {: D% A, R2 I2 ~# x- k/ S# r
{/ P+ T( F' }. e
printf("can't write datas to RS232\n");. j1 h% q+ d. F2 ^/ z' E
exit(0);* ~3 K$ r4 P* n# E. o: @
}
9 U9 k) z5 g- e7 |; j8 g/********* call hDeviceOpen in hwdll.dll to open the board***/) q; G n% c# N3 l
// hCloseDevice 说明:
3 B7 d, _3 j2 g# Q; I// BOOL hCloseDevice(HANDLE *DeviceHandle)
- j5 [4 O P& d0 ?# I: c5 `: o0 m5 u// 作用:关闭设备7 l; v6 G) Q0 g A
// 参数说明:& J0 u5 y. ?/ e& u+ P3 X( l. w
// DeviceHandle:设备句柄9 ~; W4 S/ T: I/ k$ B P' Q
// 返回值:3 O% I4 p, u( y8 |% ^, R
// 设备关闭成功返回 TRUE,失败则返回FALSE
- @( v8 T1 B) @# m8 T: [# ` if( (hOpen = hCloseDevice( &hDeviceHandle ))==FALSE): \/ q' R" F$ D8 \) R
{; W1 {. Q5 N0 ^. B7 g! a* O
printf("can't open device\n");( o/ l o$ u, _3 u% B/ X
printf("press any key to exit\n");
$ l7 Q# ^; h0 N$ K4 a: n3 I" i getch();
$ t) B0 O( n5 Y& t" E! Z return 0;% h, A9 v4 A+ e0 J. g
}" R; y) u7 u" B9 M* J
else 3 l& A! E# P; a3 `
printf("device closed\n"); printf("press any key to exit the program\n");
' i% k; p5 J4 z- x- s8 t free(hDataBuffer);
. ~5 W! ?+ Y3 P j2 m# d free(hCommandBuffer);
3 a- W" A ` c5 r getch();) X9 k( n1 X2 p6 w* ^/ C
return 0;
& P! J, J; t4 q/ U8 `* z} % u6 t* |* @3 l/ J, D* n1 A8 }
& m4 k/ g& h- y
* c' n( P# S' h; eTop
; [8 n5 ] q: m9 G
/ Q+ u2 A/ k6 r+ O/ w) [" ^ 回复人: aiyu33() ( ) 信誉:100 2003-12-17 11:41:24 得分:0 - K+ [$ x1 b0 k, N7 E, w
) r$ z3 N2 j+ a3 d* X6 _8 Z
/ j" m. @# e" }
% q+ c! X* N# C& j
upupupupupupup / ~3 q" \) O. \
h9 [5 ]3 x! t: U% l I& nTop ; D& t' l* j6 _
' l, f0 H/ h$ R; o5 y3 ~& _, c6 K
回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 12:53:39 得分:0
3 l% b$ G9 {. D- q ) t+ R8 ~! T, B, z- L7 G; A
# I# b% X# h% _4 ^0 O m* \4 Q# d+ U! {' f) R$ D
你开发的这种软件类似于Palm Desktop Software,负责Pocket与PC之间通讯,我建议你最好先写一个驱动,将USB口虚拟成一个串口,然后直接对串口操作会很方便的。我现在做的程序可能和你相似是一个CDMA模块,通过USB口与PC机连接,然后由驱动程序将它虚拟成一个串口,我的工作就是和这个虚拟的串口通讯。
( b" d- G& |: }2 g) A
/ @3 u0 I3 y' B& _- R* ~6 iTop
) O2 v$ y. d3 q
: w; p1 O4 ?( y8 j# F 回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 12:56:27 得分:0
. n2 j" l9 G7 s0 Z $ u( l4 }2 K, A- K8 f& K8 D) u$ R' _9 ?
( B [8 ?: `1 n5 a% Y9 N; u
( q/ N @& L# ~; w; G5 rPocket与PC连接肯定有驱动的,如果驱动程序没有将Pocket虚拟成一个串口,你也可以直接通过设备GUID和设备序列号进行访问,详情你参见我专栏上的一篇文章。当然了,通过虚拟串口来访问设备肯定要方便,简单些。
' w' p# O; v1 U2 @7 i+ `
9 N/ w0 R! f8 p T" [$ fTop
( P* f: y6 n# [% l6 r7 u7 Y ( V3 O' w c6 ?5 j1 w. C% q
回复人: aiyu33() ( ) 信誉:100 2003-12-17 13:31:08 得分:0 + t# V( b) j- H. t. g* p
6 T! s3 Y& [! B6 D ; N! u+ b) N# A, J9 p/ V
$ y! C% x$ |! _% d% T% g我得这款pocketpc默认只支持使用usb与pc相连的,而且activesync3.7就是使用usb传输数据的。如果我自己写驱动的话,不仅不熟悉而且很可能activesync3.7这个软件就使用不了。我只需要利用它的驱动。你的专栏上的那篇文章我也看了,我就是模仿你的写的代码,但就是到createfile这步就不行了,我的同事是用palm开发类似的程序,也是到这步就行不通了,是不是有其他的原因?7 q: p) X5 z* K% r: o
我还想问问如果驱动程序将pocket虚拟成串口,如何查看它的符号名呢? # c3 S6 b5 P8 }% H- j7 F
# s2 g8 C7 q( |4 F) P A
. K9 p5 C" E" c7 s V% q( x
Top
2 |- T4 j9 B. W3 I
s; j1 w8 t3 ?! v$ C$ u 回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 16:53:17 得分:0 + W! m+ t x- q; t* d) I' z6 S
& r7 ?5 q; Z0 R
" R; m5 s, {" G + a2 k8 u. h- L s$ p( q
假如将一个USB设备虚拟成串口的话,那么它的符号名可能是COM3,COM4,或COMn,这根据你当前PC机的配置而定 。它的符号名位于注册表中HKEY_LOCAL_MACHINE\CurrentControlSet中,你可以搜索注册表,另外在2000或以上的操作系统中,你可以到HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SerialComm中看到。 2 x4 D- G6 g' { I
@. j* N+ O6 `7 n4 u" v, v/ S
Top
! }3 |, {0 w* z/ z3 u
! _) P6 y6 \1 C- E6 ~* @. T 回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 16:55:33 得分:0 - ]1 I4 ~! ~; b! F- i- n+ V2 P9 m
s! a: a# \5 \: \
V% n! i) p1 ]
7 A1 L$ T. q9 J我以前在一张贴子中详细回答了如何利用设备序列号和设备GUID来访问该设备,你可以搜索一下CSDN。你所说的CreateFile不能打通设备,你要查一下,你的符号名是否正确,包括设备序列号和设备GUID是否正确,设备GUID你可以从驱动程序的安装向导文件.inf中找到,设备序列号则需要你到注册表中去找。 ' P- }1 b8 @$ h3 J5 a6 \
7 |- L! o) k; |
Top 5 Y" o% {1 t2 s5 P- ?
( m ^1 R" f$ Y2 S7 w4 J+ T' u( M
回复人: gyj_china(透明) ( ) 信誉:98 2003-12-17 18:15:30 得分:90 $ |8 U: v: @0 x+ W
3 L: v+ l9 T. R+ I! E f7 H : S Y# i+ S/ n, J0 t
0 m* c, n3 n# m3 ^* Z# s) f
没有星星不敢发言:( 8 ?& {9 u. M( L1 P
( U' I4 D s" h8 f4 N/ R) m- wTop 3 c% m4 c; H9 F' n3 |
6 y/ _$ Z1 f- d( c 回复人: aiyu33() ( ) 信誉:100 2003-12-19 18:27:28 得分:0
1 n: s; Q7 Q6 e% \) P / }* O/ H. F& N
- M) o" ^- d9 [1 Y+ i( Q7 I
2 y% I7 z) s4 x不好意思,是因为ActiveSync3.7一直在系统服务程序中运行,占用了驱动程序,所以不能打开设备。我删除了ActiveSync3.7后就可以了。 |