為什么PC機(jī)無(wú)法接收數(shù)據(jù)?

從PC機(jī)端發(fā)送數(shù)據(jù)到CH372時(shí),全部都正確,

可是PC端要求接收CH372的數(shù)據(jù)時(shí),接收不到數(shù)據(jù),線程一直在等待。

我的單片機(jī)程序是這樣的。 麻煩WCH的工程師們幫看一下好嗎?謝謝!

;*******向CH372寫命令操作******************** ORDER: MOV P2,A SETB P0.3 CLR P0.5 MOV P2,A NOP SETB P0.5 mov p2,#0ffh RET ;----------------------------------------------------

;*******向CH372寫數(shù)據(jù)操作************************** WRITE: MOV P2,A CLR P0.3 CLR P0.5 MOV P2,A NOP SETB P0.5 mov p2,#0ffh RET ;--------------------------------------------------

;*******向CH372讀數(shù)據(jù)操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;------------- ;*******端點(diǎn)2 批量數(shù)據(jù)上傳子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;寫入上傳命令 ACALL ORDER nop nop nop MOV A,LEN ;先寫入數(shù)據(jù)長(zhǎng)度 mov r2,a jz int_unlk ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;發(fā)送數(shù)據(jù) ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;發(fā)送完畢,解開(kāi)緩沖區(qū)鎖 ACALL ORDER nop RET ;-----------------------------------------------------------

;*******端點(diǎn)2 批量數(shù)據(jù)下傳子程序************* BULKDOWN:MOV A,#CMD_RD_USB_DATA ;寫入下傳數(shù)據(jù)命令 ACALL ORDER NOP NOP ACALL READ ;讀取數(shù)據(jù)長(zhǎng)度 MOV R2,A JZ OUTDOWN MOV LEN,A MOV R1,#BUFFER BULKDS: ACALL READ ;接收下傳數(shù)據(jù) MOV @R1,A INC R1 DJNZ R2,BULKDS mov a,r1 clr c subb a,#05h mov lenend,a OUTDOWN:NOP RET

改成這樣你試下: ;*******向CH372讀數(shù)據(jù)操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;------------- ;*******端點(diǎn)2 批量數(shù)據(jù)上傳子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;寫入上傳命令 ACALL ORDER nop nop nop MOV A,LEN ;先寫入數(shù)據(jù)長(zhǎng)度 MOV R2,A ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;發(fā)送數(shù)據(jù) ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;發(fā)送完畢,解開(kāi)緩沖區(qū)鎖 ACALL ORDER nop RET 還有一個(gè)問(wèn)題就是你既然是用模擬口的方式來(lái)寫讀寫函數(shù),那你的WR,RD怎么沒(méi)有涉及到?


整個(gè)CH372中斷服務(wù)程序是這樣的,接收來(lái)自PC機(jī)的數(shù)據(jù)是完全正確的, 就是在發(fā)送數(shù)據(jù)到PC機(jī)時(shí),PC機(jī)的應(yīng)用程序線程一直在等待,接收不到數(shù)據(jù)。我現(xiàn)在都不知道問(wèn)題出在那里。 如果是讀寫CH372的函數(shù)錯(cuò)了,那在測(cè)試CH372時(shí)應(yīng)該通不過(guò)才是的??墒撬梢越邮盏絇C機(jī)的數(shù)據(jù),就是不能發(fā)送數(shù)據(jù)到PC機(jī)。

麻煩你們幫忙看一下吧,謝謝。

;*******向CH372寫命令操作******************** ORDER: MOV P2,A SETB P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;----------------------------------------------------

;*******向CH372寫數(shù)據(jù)操作************************** WRITE: MOV P2,A CLR P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;--------------------------------------------------

;*******向CH372讀數(shù)據(jù)操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;----------------------------------------------------- ;*******端點(diǎn)2 批量數(shù)據(jù)上傳子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;寫入上傳命令 ACALL ORDER nop nop nop MOV A,LEN ;先寫入數(shù)據(jù)長(zhǎng)度 mov r2,a ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;寫入發(fā)送數(shù)據(jù) ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;發(fā)送完畢,解開(kāi)緩沖區(qū)鎖 ACALL ORDER nop RET ;-----------------------------------------------------------

;*******端點(diǎn)2 批量數(shù)據(jù)下傳子程序************* BULKDOWN:MOV A,#CMD_RD_USB_DATA ;寫入下傳數(shù)據(jù)命令 ACALL ORDER NOP NOP ACALL READ ;讀取數(shù)據(jù)長(zhǎng)度 MOV R2,A JZ OUTDOWN MOV LEN,A MOV R1,#BUFFER BULKDS: ACALL READ ;接收下傳數(shù)據(jù) MOV @R1,A INC R1 DJNZ R2,BULKDS OUTDOWN:NOP RET ;---------------------------------------------------------

;*******CH375產(chǎn)生的中斷服務(wù)子程序******************************* INTER: MOV A,#CMD_GET_STATUS ;讀取中斷狀態(tài)碼 ACALL ORDER NOP NOP ACALL READ ;*******分析中斷產(chǎn)生的原因,并作出相應(yīng)的響應(yīng)******************** INT_1: CJNE A,#USB_INT_EP2_OUT,INT_2 ;*******端點(diǎn)2下傳中斷************************* ACALL BULKDOWN setb p0.1 SJMP EXITINTER INT_2: CJNE A,#USB_INT_EP2_IN,INT_3 ;*******端點(diǎn)2上傳中斷************************* ACALL BULKUP setb p0.0 SJMP EXITINTER INT_3: setb p0.0 setb p0.1 MOV A,#CMD_UNLOCK_USB ;解開(kāi)緩沖區(qū) ACALL ORDER ;SJMP EXITINTER EXITINTER: clr flagint setb p3.2 nop ljmp loop ;中斷返回 RET ;---------------------------------------------------------------------- ;*******主程序***************************************** main: clr flagint mov p0,#0fch mov p1,#00h mov p2,#0ffh mov p3,#0ffh

acall delay10ms

acall init mov len,#20h acall bulkup 先寫入數(shù)據(jù)到數(shù)據(jù)塊上傳端點(diǎn)。等 待PC機(jī)取走。

loop: acall delay10ms

wait: acall display nop jb flagint,intin sjmp wait sjmp wait intin: nop ljmp inter ret


先別慌用你的軟件接收,用監(jiān)視軟件看看到底有沒(méi)有數(shù)據(jù)發(fā)上去。很可能還是你的上位機(jī)軟件問(wèn)題。


你先用我們的CH372DEBUG上位機(jī)程序來(lái)調(diào)試你的下位機(jī),調(diào)試的時(shí)候,你要下發(fā)一個(gè)數(shù)據(jù)下去(批量端點(diǎn)下傳)然后在通過(guò)批量端點(diǎn)上傳就可以了


我用CH372DEBUG測(cè)試過(guò)了,一樣的問(wèn)題。 我是下發(fā)一個(gè)數(shù)據(jù),然后上傳,同樣的,線程一直在等待。 好像單片機(jī)都沒(méi)有響應(yīng)到CH372的中斷, 但是可以接受數(shù)據(jù),說(shuō)明硬件沒(méi)有問(wèn)題。

我想最有可能是的單片機(jī)程序中的上傳批量數(shù)據(jù)部分有問(wèn)題。 但是我不知道問(wèn)題出在那里。

我在單片機(jī)中,用查詢方式響應(yīng)CH372的中斷, 全部的程序是這樣子的。

flagint BIT 20H.3 ;中斷標(biāo)志 lenend data 3eh

ORG 0000H LJMP MAIN

;*******向CH372寫命令操作******************** ORDER: MOV P2,A SETB P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;----------------------------------------------------

;*******向CH372寫數(shù)據(jù)操作************************** WRITE: MOV P2,A CLR P0.3 CLR P0.5 NOP SETB P0.5 mov p2,#0ffh RET ;--------------------------------------------------

;*******向CH372讀數(shù)據(jù)操作************************* READ: MOV P2,#0FFH CLR P0.3 CLR P0.4 MOV A,P2 NOP SETB P0.4 mov p2,#0ffh RET ;-----------------------------------------------------

;*******初始化CH372子程序 ,測(cè)試CH372工作是否正常****** INIT: ;CLR FLAG_SEND_WAIT ;CLR FLAG_INT_WAIT nop MOV A,#CMD_CHECK_EXIST ACALL ORDER MOV A,#55H ACALL WRITE CPL A MOV R7,A ACALL READ XRL A,R7 JZ INIT_OK MOV A,#CMD_RESET_ALL MOV R7,#50H INITHR: ACALL ORDER DJNZ R7,INITHR MOV R7,#0A0H INITD2: CLR A INITD1: DJNZ ACC,INITD1 DJNZ R7,INITD2 SJMP INIT ;-----------------------------------------------------

;********設(shè)置CH372的工作模式***************** INIT_OK:MOV A,#CMD_SET_USB_MODE ;設(shè)置CH372芯片的工作模式 ACALL ORDER MOV A,#02H ;02H為內(nèi)致固件模式 ACALL ORDER NOP NOP WAITINIT:ACALL READ XRL A,#CMD_RET_SUCCESS ;等待設(shè)置成功 JNZ WAITINIT RET ;------------------------------------------------------

;*******端點(diǎn)2 批量數(shù)據(jù)上傳子程序******************** BULKUP: MOV A,#CMD_WR_USB_DATA7 ;寫入上傳命令 ACALL ORDER nop nop nop MOV A,LEN ;先寫入數(shù)據(jù)長(zhǎng)度 mov r2,a ACALL WRITE MOV R1,#BUFFER BULKSEND:MOV A,@R1 ;寫入發(fā)送數(shù)據(jù) ACALL WRITE INC R1 DJNZ r2,BULKSEND INT_UNLK:MOV A,#CMD_UNLOCK_USB ;發(fā)送完畢,解開(kāi)緩沖區(qū)鎖 ACALL ORDER nop RET ;-----------------------------------------------------------

;*******端點(diǎn)2 批量數(shù)據(jù)下傳子程序************* BULKDOWN:MOV A,#CMD_RD_USB_DATA ;寫入下傳數(shù)據(jù)命令 ACALL ORDER NOP NOP ACALL READ ;讀取數(shù)據(jù)長(zhǎng)度 MOV R2,A JZ OUTDOWN MOV LEN,A MOV R1,#BUFFER BULKDS: ACALL READ ;接收下傳數(shù)據(jù) MOV @R1,A INC R1 DJNZ R2,BULKDS OUTDOWN:NOP RET ;---------------------------------------------------------

;*******CH375產(chǎn)生的中斷服務(wù)子程序******************************* INTER: MOV A,#CMD_GET_STATUS ;讀取中斷狀態(tài)碼 ACALL ORDER NOP NOP ACALL READ ;*******分析中斷產(chǎn)生的原因,并作出相應(yīng)的響應(yīng)******************** INT_1: CJNE A,#USB_INT_EP2_OUT,INT_2 ;*******端點(diǎn)2下傳中斷************************* ACALL BULKDOWN setb p0.1 SJMP EXITINTER INT_2: CJNE A,#USB_INT_EP2_IN,INT_3 ;*******端點(diǎn)2上傳中斷************************* ACALL BULKUP setb p0.0 SJMP EXITINTER INT_3: setb p0.0 setb p0.1 MOV A,#CMD_UNLOCK_USB ;發(fā)送完畢,解開(kāi)緩沖區(qū)鎖 ACALL ORDER ;SJMP EXITINTER EXITINTER: clr flagint setb p3.2 nop ljmp loop ;中斷返回 RET ;----------------------------------------------------------------------

;*******顯示數(shù)據(jù)子程序***************顯示緩沖區(qū)為40H~80H********** ;org 00cah display: mov dptr,#tab mov a,30h ;顯示30H movc a,@a+dptr mov p1,a clr p3.4 acall delay cpl p3.4 jb flagint,outdis

mov a,31h ;顯示31H movc a,@a+dptr mov p1,a clr p3.5 acall delay cpl p3.5 jb flagint,outdis

mov a,32h ;顯示32H movc a,@a+dptr mov p1,a clr p3.6 acall delay cpl p3.6 jb flagint,outdis

mov a,33h ;顯示33H movc a,@a+dptr mov p1,a clr p3.3 acall delay cpl p3.3 jb flagint,outdis outdis: nop ret ;org 0109h TAB: DB 0D7H, 11H, 0CDH, 05DH, 1BH ;0,1,2,3,4 DB 5EH, 0DEH, 015H , 0DFH, 5FH, ;5,6,7,8,9 db 0f8h, 0dah, 0c8h, 0d9h, 0cfh, 08eh ;a,b,c,d,e,f db 08h, 08h, 08h, 08h, 08h ;end-

;org 0114h ;**************************************************************** ;顯示延遲子程序,每調(diào)用一次延時(shí)1ms delay: del: mov r7,#0fah deh: jnb p3.2,outdel djnz r7,deh nop sjmp outdelx outdel: setb flagint setb p3.2 nop outdelx:nop ret ;-----------------------------------------------------

;*******主程序***************************************** main: clr flagint mov p0,#0fch mov p1,#00h mov p2,#0ffh mov p3,#0ffh

acall delay10ms

acall init

mov len,#20h acall bulkup ;上傳32個(gè)隨機(jī)數(shù)

loop: ;acall delay10ms mov r3,#00h acall data0x mov r4,#255

wait: nop acall display nop jb flagint,intin djnz r4,wait mov r4,#255 inc r3 acall data0x mov a,r3 clr c cjne a,len,waitw resetr3:mov r3,#00h acall data0x clr p0.0 clr p0.1 sjmp wait waitw: jnc resetr3 sjmp wait sjmp wait

intin: nop ljmp inter

ret

;******延時(shí)10ms ***************** delay10ms: mov r6,#0f0h del10ms:mov r7,#0f0h nop deh10ms:djnz r7,deh10ms djnz r6,del10ms ret ;*******數(shù)據(jù)轉(zhuǎn)換************************ data0x:mov a,r3 anl a,#0fh mov 31h,a mov a,r3 swap a anl a,#0fh mov 30h,a

mov a,r3 add a,#40h mov r0,a mov a,@r0 anl a,#0fh mov 33h,a mov a,@r0 swap a anl a,#0fh mov 32h,a nop

ret end


當(dāng)我用中斷方式響應(yīng)CH372的中斷時(shí), 發(fā)現(xiàn)中斷無(wú)法正確地返回到產(chǎn)生中斷的地方,(可能是在中斷里面調(diào)用子程序過(guò)多) 所在改成查詢方式來(lái)響應(yīng)CH372的中斷。


你試下我的這個(gè)程序,這個(gè)程序是先接收上位機(jī)的數(shù)據(jù),接著將上位機(jī)的數(shù)據(jù)去反之后上傳給計(jì)算機(jī)UploadImages/hcn0012006615144350.rar


對(duì),我就是用你們這個(gè)程序作修改的。 只是把里面的數(shù)據(jù)操作做了改動(dòng)。 因?yàn)槲以赑CB布線時(shí),為了作一個(gè)單面板, 而用P0口時(shí)很難布,所以就改成了P2口。用P0口作為讀寫的地址。 所以現(xiàn)在才那么郁悶。


你用P2口的話,那就是讀和寫的子函數(shù)不一樣而已,實(shí)際的流程并沒(méi)有什么大的差別,你的讀和寫的子程序,個(gè)人認(rèn)為存在問(wèn)題,讀和寫的線都沒(méi)有操作,你怎么進(jìn)行讀和寫啊!即使有一個(gè)操作成功了,那另外一種也是不可以操作的


我在讀寫子程序里面,分別對(duì)CH372的A0,RD,WR進(jìn)行位操作。 對(duì)應(yīng)關(guān)系是這樣的。

A0——P0.3 WR——P0.5 RD——P0.4

寫命令時(shí),置P0.3為1,P0.5為0,其它為1 寫數(shù)據(jù)時(shí),P0.3為0,P0.5為0,其它為1 讀數(shù)據(jù)時(shí),P0.3為0,P0.4為0,其它為1


你寫的上傳程序是有點(diǎn)問(wèn)題,你應(yīng)該先寫數(shù)據(jù)到375,當(dāng)PC機(jī)將數(shù)據(jù)取走之后,375才會(huì)產(chǎn)生中斷,你讀取的中斷狀態(tài)應(yīng)該為批量端點(diǎn)上傳成功,這時(shí)候在中斷程序里面先將375解鎖之后在將數(shù)據(jù)寫到375等待計(jì)算機(jī)取走數(shù)據(jù),


你的意思是不是說(shuō), 在獲取CH372的批量數(shù)據(jù)上傳上中斷之前,一定要先寫入一個(gè)數(shù)據(jù),等待PC機(jī)取走, 然后,等到CH372的批量數(shù)據(jù)上傳中斷的發(fā)生,再解鎖,解鎖之后,再次寫入上傳的數(shù)據(jù)。

是不是這樣呢?


可以這樣理解,實(shí)際是只要先將數(shù)據(jù)先到372等待主機(jī)取走數(shù)據(jù),取走之后372才會(huì)給單片機(jī)中斷


我按照這個(gè)時(shí)序來(lái)進(jìn)行寫數(shù)據(jù)。 還是不行。

我首先是無(wú)條件地寫一個(gè)長(zhǎng)度為20H 的數(shù)據(jù)到批量上傳端點(diǎn)里,寫完后不作任何處理。 在批量上傳中斷里,我先作解鎖。然后再次寫入數(shù)據(jù)。 這樣的一個(gè)時(shí)序應(yīng)該沒(méi)有問(wèn)題了吧。


你如果先上傳的話,在你設(shè)置好模式之后,加上這段程序,目的是為了檢查你的計(jì)算機(jī)有沒(méi)有準(zhǔn)備好: CH375_UPLOAD_P0: MOV R3,32H LJMP DELAY50MS CH375_UPLOAD_P01: MOV DPTR,#CH375_CMD_PORT ;檢查計(jì)算機(jī)是否準(zhǔn)備好 MOV A,#0AH MOVX @DPTR,A MOV DPTR,#CH375_DAT_PORT MOV A,#20H MOVX @DPTR,A NOP NOP NOP MOVX A,@DPTR ANL A,#20H CJNE A,#20H,CH375_UPLOAD_P0 DELAY50MS: MOV R1,#0AH DL2: MOV R2,#18H DL1: NOP NOP DJNZ R2,DL1 DJNZ R1,DL2 DJNZ R3,DELAY50MS LJMP CH375_UPLOAD_P01 或者你先發(fā)一個(gè)數(shù)據(jù)下去之后,然后單片機(jī)接收到數(shù)據(jù)之后在給計(jì)算機(jī)上傳數(shù)據(jù)也是可以的


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频