請教:單片機讀不到上位機通過CH372發(fā)回來的數(shù)據(jù)

例如:我通過PC機發(fā)送10給CH372,然后用單片機讀取上位機發(fā)回的數(shù)據(jù)。 以下是中斷服務(wù)程序:已經(jīng)檢測到程序進(jìn)入了case 0x02:, 1、上位機只發(fā)一個數(shù),收到的數(shù)據(jù)長度應(yīng)該為1吧?不會再帶有其他數(shù)據(jù)吧(我沒有發(fā)其他的)? 2、這個長度可以檢測得到(length=1),但發(fā)下來的數(shù)據(jù)檢測不到(RE_DATA的值總是為0),幫看看程序哪里出了問題,例如需不需要延時之類的。 3、若正常的話收到的應(yīng)該是原數(shù)據(jù)而不是它的反碼吧? SendCommand372(GET_STA); // 讀CH372的中斷狀態(tài)的命令,并通知CH372取消中斷請求 InitFlag=Read_Data372();// 讀CH372的中斷狀態(tài) switch(InitFlag) { case 0x02: //USB_INT_EP2_OUT //批量端點/端點2接收到數(shù)據(jù),OUT成功 SendCommand372(R_USB_DATA);// 寫入讀端點2數(shù)據(jù)的命令,釋放緩沖區(qū) length=Read_Data372(); //讀端點2收到數(shù)據(jù)的字節(jié)數(shù) if(length != 0) { RE_DATA=Read_Data372();//4、只有一個數(shù)據(jù)可以不用循環(huán)讀取吧? } break; ....... } 我用的是AVR單片機,沒能用你們提供的測試程序進(jìn)行檢測

(1)上位機只發(fā)一個數(shù),那么下位機只會收到1個數(shù)據(jù) (2)程序沒有判斷l(xiāng)ength是否為1,讀取數(shù)據(jù)部分基本沒問題,R_USB_DATA是哪個命令,讀數(shù)據(jù)命令有2個,使用0x27的話需要添加解鎖命令 (3)肯定是原始數(shù)據(jù) (4)可以不用,但必須確保僅有一個數(shù)據(jù) (5)下載CH372DBG調(diào)試你的下位機


讀取函數(shù)這樣寫就可以了: SendCommand372(R_USB_DATA);// 寫入讀端點2數(shù)據(jù)的命令,釋放緩沖區(qū) length=Read_Data372(); //讀端點2收到數(shù)據(jù)的字節(jié)數(shù) for( i=0;i!=length;i++ )RE_DATA[i]=Read_Data372();//4、只有一個數(shù)據(jù)可以不用循環(huán)讀取吧?


謝謝你們的指導(dǎo),但我修改程序后還是沒能通過,以下是程序,麻煩再幫看一下,我用的是AVR單片機,也下載了CH372DBG,但不知道怎么利用它來進(jìn)行調(diào)試。 #define R_USB_DATA 0x28

unsigned char Read_Data372(void)//讀數(shù)據(jù)函數(shù) { uint mData;//用于存放讀取的數(shù)據(jù)

Delay1uS(1); /* 至少延時1.2uS */ DDRA = 0x00; /* 數(shù)據(jù)輸入 */

PORTD&=~BIT(2);//CH372_A0_L;操作數(shù)據(jù) PORTD|=BIT(4);//WR=1,禁止寫功能 PORTD&=~BIT(5);//CH372_RD_L;讀-數(shù)據(jù) DDRA = 0x00; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mData = PINA; /* 從CH375的并口PA輸入數(shù)據(jù) */ PORTD|=BIT(4); PORTD|=BIT(5); return mData; }

case 0x02: //USB_INT_EP2_OUT //批量端點/端點2接收到數(shù)據(jù),OUT成功 SendCommand372(R_USB_DATA);// 寫入讀端點2數(shù)據(jù)的命令,釋放緩沖區(qū) // Delay1uS(10); //加延時也不行 length=Read_Data372(); //讀端點2收到數(shù)據(jù)的字節(jié)數(shù) for( i=0;i!=length;i++ ) THIS_CMD_CODE=Read_Data372(); if ( THIS_CMD_CODE == 0 ) //0 {//若收到數(shù)據(jù)為0,PB0對應(yīng)的發(fā)光二極管閃爍 PORTB|=BIT(0); delay(12000); PORTB&=~BIT(0); delay(8000); PORTB|=BIT(0); delay(12000); } else if ( THIS_CMD_CODE == 21) {//若收到數(shù)據(jù)為21,PB1對應(yīng)的發(fā)光二極管閃爍 PORTB|=BIT(1); delay(12000); PORTB&=~BIT(1); delay(8000); PORTB|=BIT(1); delay(12000); PORTB&=~BIT(1); } else { //若不是以上數(shù)據(jù)PB4對應(yīng)的發(fā)光二極管閃爍 PORTB|=BIT(4); delay(8000); PORTB&=~BIT(4); delay(4000); PORTB|=BIT(4); delay(8000); PORTB&=~BIT(4); } break; 測試時,檢測得到length=1,但無論發(fā)什么數(shù)據(jù)下來THIS_CMD_CODE的值總是為0(PB0對應(yīng)的發(fā)光二極管閃爍) 希望能耐心幫我看看,謝謝


我是利用CH375DLL.H中的CH375WriteData給下位機發(fā)單個數(shù)據(jù),例如將21賦給iBuffer,將1賦給ioLength,測試時,BOOL=1,iBuffer=21,ioLength=1. BOOL WINAPI CH375WriteData( // 寫出數(shù)據(jù)塊 ULONG iIndex, // 指定CH375設(shè)備序號 PVOID iBuffer, // 指向一個緩沖區(qū),放置準(zhǔn)備寫出的數(shù)據(jù) PULONG ioLength ); // 指向長度單元,輸入時為準(zhǔn)備寫出的長度,返回后為實際寫出的長度


如果只發(fā)一個字節(jié)的話,程序這樣寫試試. unsigned char Buffer=21; unsigned long length =1; CH375WriteData(0,&Buffer,&length);//注意參數(shù)的傳遞


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

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