[求助]這個問題百思不得其解

高手們幫我看看這個中斷程序 不知道為什么BUFFER里的值老是賦不到DATA里(中斷已驗證能進(jìn)去) /* CH375中斷服務(wù)程序,使用寄存器組1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */

DATAl[0]=buffer[0]; DATAl[1]=buffer[1]; DATA=(DATAl[0]<<8)+DATAl[1];

/* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( buffer[ i ]^0xff ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ EA=0; dac(); EA=1;

break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

參數(shù)的申明如下 unsigned int DATAl[2]; unsigned int DATA;


你程序是不是調(diào)試的時候有問題啊,你試我的程序試下,沒問題的: void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ data1[0]=buffer[0]; data1[1]=buffer[1]; data2=(data1[1]<<8)|data1[0]; /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( 2 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ CH375_WR_DAT_PORT( data2>>8 ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ CH375_WR_DAT_PORT( data2&0xff); break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } } 參數(shù)申明: unsigned char data1[2]; unsigned short data2; 用CH372DEBUG調(diào)試


能用了,謝謝哦,我先仔細(xì)看看你的程序


遇到很奇怪的問題, 當(dāng)我把data2=(data1[1]<<8)|data1[0];改為data2=(data1[0]<<8)|data1[1];那么無論我從PC發(fā)的數(shù)是什么, data2的后8位為0,高手繼續(xù)幫著解決吧,謝謝!


想問TEST_DATA發(fā)出的數(shù)在單片機收到后在buffer里怎樣放的?buffer[0]里是高八位還是低八位 上位機的程序是這樣的: // 2003.09.08, 2003.12.28 //**************************************** //** Copyright (C) W.ch 1999-2005 ** //** Web: http://www.winchiphead.com ** //**************************************** //** DLL for USB interface chip CH375 ** //** C, VC5.0 ** //**************************************** // // USB總線接口芯片CH375的數(shù)據(jù)塊測試程序 V1.0 // 南京沁恒電子有限公司 作者: W.ch 2003.12 // CH375-BLK V1.0 // 運行環(huán)境: Windows 98/ME, Windows 2000/XP // support USB chip: CH372/CH375 //

// 本程序測試數(shù)據(jù)傳輸?shù)恼_性,可以用于長時間連續(xù)測試,對應(yīng)的單片機端的測試程序為TEST.C // 方法: 下傳隨機長度的隨機數(shù)據(jù)包,被單片機接收并將數(shù)據(jù)按位取反后返回,最終由計算機程序接收后比較數(shù)據(jù)是否正確

#include #include #include #include #include

#include "CH375DLL.H" // CH375的動態(tài)鏈接庫

// 我們在計算機和單片機的應(yīng)用程序之間約定下傳數(shù)據(jù)的首字節(jié)是命令碼 unsigned int TEST_DATA=0x6660; //所要發(fā)的數(shù)據(jù)

#pragma comment(lib,"CH375DLL")

//程序入口 void main ( ) { unsigned char mBuffer[100]; unsigned char mReadBuf[100]; unsigned long i, mLength, mErrCnt, mTotal;

printf( "\nCH372/CH375 Bulk Data Test Program V1.1 , Copyright (C) W.ch 2004.12\n" ); printf( "test data correctness \n" );

// 需要使用DLL則需要先加載,沒有此句則會自動加載 printf( "*** Load DLL: CH375DLL.DLL \n" ); if ( LoadLibrary( "CH375DLL.DLL" ) == NULL ) return; // 加載DLL失敗,可能未安裝到系統(tǒng)中

printf( "*** CH375OpenDevice: 0# \n" ); if ( CH375OpenDevice( 0 ) == INVALID_HANDLE_VALUE ) return; /* 使用之前必須打開設(shè)備 */ mErrCnt=0; //CH375SetTimeout( 0, 5000, 5000 ); // 設(shè)置USB數(shù)據(jù)讀寫的超時,超過5000mS未完成讀寫將強制返回,避免一直等待下去

mBuffer[0]=TEST_DATA>>8; mBuffer[1]=TEST_DATA&0xff; mTotal=2; // 隨機數(shù)長度 if ( mTotal == 0 || mTotal > 2 ) mTotal=2; printf( "Len=%2ld, Data: %02XH,%02XH\xd", mTotal, mBuffer[0], mBuffer[1]); Sleep( 500 ); CH375WriteData( 0, mBuffer, &mTotal ); if ( CH375WriteData( 0, mBuffer, &mTotal ) ) // 發(fā)送成功 { mLength =2; Sleep( 600 ); // 考慮到之前單片機準(zhǔn)備上傳的數(shù)據(jù)可能未被計算機取走,導(dǎo)致首次回傳有可能直接讀到之前的數(shù)據(jù)而不是本次數(shù)據(jù)的取反,所以首次回傳先等待單片機準(zhǔn)備好取反數(shù)據(jù) if ( CH375ReadData( 0, mReadBuf, &mLength ) ) // 接收成功 { if ( mLength != mTotal || mLength==0 ) { // 長度錯誤 mErrCnt++; printf( "\nS1- return length error: %ld (%ld)\n",mLength, mTotal ); } else { for ( i=0; i if ( mReadBuf[ i ]!=mBuffer[i] ) { // 取反值比較錯誤 mErrCnt++; printf( "\nS1- return data error at %ld: %02XH (%02XH)\n",i, mReadBuf[i], mBuffer[i] ); } else printf( "\nDATA at %ld: %02XH (%02XH)\n",i, mReadBuf[i], mBuffer[i] ); } } } else { // 讀操作失敗 mErrCnt++; printf( "\nS1- CH375ReadData return error, length=%ld\n", mTotal ); } } else { // 寫操作失敗 mErrCnt++; printf( "\nS1- CH375WriteData return error, length=%ld\n", mTotal ); }

if ( mErrCnt==0 ) printf( "\n*** passed \n" );

// 關(guān)閉CH375設(shè)備,如果不繼續(xù)使用則必須關(guān)閉設(shè)備,就象讀寫完硬盤中的數(shù)據(jù)文件后要關(guān)閉一樣 printf( "\n*** Total error = %ld \n", mErrCnt ); printf( "*** CH375CloseDevice: 0 \n" ); CH375CloseDevice( 0 );

printf( "\nExit.\n" ); getch(); }

想問TEST_DATA發(fā)出的數(shù)在單片機收到后在buffer里怎樣放的?buffer[0]里是高八位還是低八位


剛剛測試過,你上面的那個改法是可以工作的,是不是你調(diào)試有問題啊。


是可以工作,但是測出來的數(shù)據(jù)不對,我再好好研究研究,謝謝


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

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