[求助]請教技術(shù)員個問題

我是用USB做數(shù)據(jù)采集的,我想主動傳送,也就是采集到64個字節(jié)就傳一次,可為什么必須要在上位機里先寫數(shù)據(jù)后在讀數(shù)據(jù)呀,上位機才能接到數(shù)據(jù),當然固件里要把發(fā)數(shù)據(jù)放在case USB_INT_EP2_OUT:后。我想先發(fā)數(shù)據(jù),把發(fā)數(shù)據(jù)代碼放在主程序里,可上位機怎么也收不到數(shù)據(jù),是不是要在上位機里用你們的中斷才行,而不是用讀數(shù)據(jù)的方法呀!請你們給點提示,或者例子。謝謝?。?/p>

這個是首先通過中斷端點上傳數(shù)據(jù)的例子程序,你只需要修改下就可以通過端點2傳輸數(shù)據(jù)

/* MCS-51單片機C語言的示例程序,用于其它單片機時一般只要修改前面幾個接口子程序及硬件定義 */

#pragma NOAREGS #include #include #include #include "CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評估板資料中有 */ unsigned char buf[8];//={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ sbit CH375_WIRE = P3^2; /* 延時2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機的時鐘選擇初值 */ }

/* 基本操作 */

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */ delay2us(); CH375_CMD_PORT=cmd; delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ CH375_DAT_PORT=dat; }

unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ return( CH375_DAT_PORT ); }

/* 延時50毫秒,不精確 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 測試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測試數(shù)據(jù) */ i = ~ 0x55; /* 返回數(shù)據(jù)應(yīng)該是測試數(shù)據(jù)取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延時50ms */ } /* 設(shè)置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ // for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ // if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; // } /* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ // IT0 = 0; /* 置外部信號為低電平觸發(fā) */ // IE0 = 0; /* 清中斷標志 */ // EX0 = 1; /* 允許CH375中斷 */ }

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 ); /* 從當前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ){ buf[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ } CH375_WR_CMD_PORT( CMD_WR_USB_DATA5 ); /* 從當前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ CH375_WR_DAT_PORT(length); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for(i=0;i!=length;i++) CH375_WR_DAT_PORT( ~buf[i] );//通過中斷端點演示上傳,一次上傳的長度不能超過8字節(jié),這些在你通過批量端點上傳的時候是用不到的 break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ break; } case USB_INT_EP1_IN: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ break; } }

} void sent_data(){ unsigned char i; for(i=0;i!=8;i++) buf[i]=i; CH375_WR_CMD_PORT(CMD_WR_USB_DATA5);//如果是端點2上傳的話,只要將CMD_WR_USB_DATA5改為CMD_WR_USB_DATA7就可以了 CH375_WR_DAT_PORT(8); for(i=0;i!=8;i++) CH375_WR_DAT_PORT(buf[i]); }

void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }

main( ) { unsigned char c; Delay50ms( ); /* 延時等待CH375初始化完成,如果單片機由CH375提供復(fù)位信號則不必延時 */ CH375_Init( ); /* 初始化CH375 */ mInitSTDIO( ); while(1){ /*用來確定主機是否準備好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } Delay50ms(); sent_data();/*發(fā)送數(shù)據(jù)*/ while(1){ if(CH375_WIRE==0){ mCh375Interrupt(); sent_data(); } } }


我想你沒明白我說的意思,我想問的是固件程序在模式2下用 Delay50ms(); sent_data();/*發(fā)送數(shù)據(jù)*/ while(1){ if(CH375_WIRE==0){ mCh375Interrupt(); sent_data(); } 這個語句,在上位機的程序該怎么寫,才收得到,好像用你們的TEST里面的接收數(shù)據(jù)的方式不行。我是用的模式2,能不能說一下,用你們的那個API函數(shù)?


您可以用中斷上傳來通知上位機,上位機中有個api函數(shù)CH375SetIntRoutine設(shè)定中斷服務(wù)程序,當您下位機里通過中斷端點上串一個特征碼后,上位機就進入中斷服務(wù)程序,然后在中斷服務(wù)程序再調(diào)用CH375ReadData讀數(shù)據(jù),下位機里在接受到USB_INT_EP1_IN中斷后,通過端點2來發(fā)送數(shù)據(jù)


有沒有相關(guān)的例子呀!


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

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