ch375釋放緩沖期區(qū)有時無效

單片機工作在8MHZ范圍,當上位機下傳數(shù)據(jù)后單片機接收到數(shù)據(jù)后,執(zhí)行釋放緩沖命令有時候無效,要連續(xù)執(zhí)行幾次才有效。有時候一次就有效! 更重要的問題是,當上位機發(fā)送多個數(shù)據(jù)包的時候單片機斷當無法正常接收獲丟包的時候,單片機會停止工作,單片機內(nèi)中斷全部停止!我的程序設(shè)計是無論上位機是否有數(shù)據(jù)傳過來無論是否傳送的數(shù)據(jù)正確單片機程序都自動運行! 請給點建議?

還有就是由于ch375釋放緩沖有時有校有時無效,弄得我的上位機于單片機通訊時常斷開, 通訊程序也不能一一對應(yīng),單片機端要定期的多次執(zhí)行釋放375的緩沖,才能通訊! 當單片機端上傳數(shù)據(jù)后,在檢查有無數(shù)據(jù)下次傳時居然檢查到有數(shù)據(jù)下傳,而下傳的數(shù)據(jù)竟然是我要上傳給pc的數(shù)據(jù)? 請問這是為什么???

能不能做到這樣:單片機定時檢查有無數(shù)據(jù)下傳,如果有則處理,如果沒有則不管繼續(xù)執(zhí)行自身的程序,單片機上傳數(shù)據(jù)后,檢查數(shù)據(jù)是否取走如果取走繼續(xù)發(fā)送,如果沒有則等待(直到超時)

從你反映的現(xiàn)象來看,你的單片機程序可能有問題。CH375怎么會讓你的單片機停止工作呢?CH375做為一個外部器件,所有的動作都是MCU來控制的。不會去影響你的MCU的。 您還是仔細檢查一下你的單片機程序吧。 至于丟包的問題,你需要注意,你的MCU中斷觸法方式是什么?沿觸發(fā)還是電平觸發(fā)?CH375有中斷,就會產(chǎn)生低電平,直到獲取中斷狀態(tài)才取消,如果MCU為沿觸發(fā)方式,則有可能丟中斷,比如在處理其他程序時把中斷關(guān)閉了。 你怎么來判斷釋放緩沖區(qū)無效的?另外,你怎么去檢測有沒有數(shù)據(jù)下傳的?你的做法可能是錯誤的,才認為CH375有問題。 CH375應(yīng)該不會出現(xiàn)你說的這些問題,你還是按照我的提問,把你的程序所處理的方法列出來,方便我們幫你檢查問題。


按照樓主的描述的現(xiàn)象來判斷,個人認為可能是你程序的流程上面除了問題,或者中斷處理上面有問題,例如在讀取CH375數(shù)據(jù)的時候又來別的中斷把讀取數(shù)據(jù)給打斷導(dǎo)致出現(xiàn)問題。 還有樓主說的“單片機定時檢查有無數(shù)據(jù)下傳,如果有則處理,如果沒有則不管繼續(xù)執(zhí)行自身的程序,單片機上傳數(shù)據(jù)后,檢查數(shù)據(jù)是否取走如果取走繼續(xù)發(fā)送,如果沒有則等待(直到超時)”。前面部分是沒問題的,但是后面部分建議你不要使用超時,因為你寫到CH372數(shù)據(jù)之后,這個時候,實際在等待計算機取走,建議計算機盡量快的取走數(shù)據(jù)。采用一直等待計算機取走數(shù)據(jù)的方式比較好點?;蛘叱袝r間設(shè)置長點。


對于375單片機端我沒有用任何的外部中斷,檢查pc有無數(shù)據(jù)下傳是定時輪詢檢查!因為我的程序設(shè)計要求不是非得每次都把數(shù)據(jù)上傳,而是在可以上傳的時候就上傳mcu忙碌的時候就不上傳,上傳的數(shù)據(jù)實際上是沒有什么用的!所以就造成了pc端定時向mcu發(fā)送要數(shù)據(jù)的請求,而mcu有可能接受他的要求上傳數(shù)據(jù),有可能不理他!或直接清除375的緩沖! 現(xiàn)在有時候通訊會斷開我到不是很著急!按下復(fù)位鍵就好了!最頭疼的就是當mcu與pc通訊中斷3秒以上的時候mcu就停止工作?。ㄍㄓ崗氐讛嚅_)3秒鐘以下就沒有問題(通訊會自動重新連接好)。一會我把我的程序發(fā)上來請指教一下


MCU停止工作?是程序跑飛了還是停止工作了?你好好查查MCU的程序,看看是不是RAM溢出了。估計這個需要做實驗驗證。


volatile unsigned char usb_ptr(void)reentrant//中斷查詢 { volatile unsigned char inter=0; inter=0; choose_138(6); data_control(0); delay_us(); *A0_ml=0x22;//寫入0x22命令 delay_us(); inter=*A0_sj; choose_138(4); data_control(0); *A0_sj=0;

if(inter ==0x02) { inter=0; return 3;//批量端點2接收到數(shù)據(jù) } else if(inter==0x0A) { inter=0; return 4;//批量端點2發(fā)送完數(shù)據(jù) } else { inter=0; return 0; } } void write_usb_unlock(void)reentrant//釋放當前的緩沖區(qū) { choose_138(6); *A0_ml=0X23; delay_us(); choose_138(4); data_control(0); } void write_usb(unsigned char len, unsigned char xdata * pcdata)reentrant { unsigned char xh0=0; unsigned char fssj; choose_138(6); *A0_ml=0x2B;//啟動讀寫控制端(上傳緩沖區(qū)2) *A0_sj=len;//寫入長度 for(xh0=0;xh0<=len-1;xh0++)//寫入數(shù)據(jù) { choose_138(4); data_control(0); fssj= *(pcdata+xh0); choose_138(6); *A0_sj=fssj; } choose_138(4); data_control(0); } volatile unsigned char read_usb(unsigned char xdata * cjsj1) { volatile char xh1=1; volatile unsigned char dtcount=0; volatile unsigned char jssj=0; choose_138(6);//ch375 data_control(0); delay_us(); *A0_ml=0x22;//寫入0x22命令 delay_us(); if(*A0_sj==0x02)//接收到批量數(shù)據(jù) { choose_138(6); *A0_ml=0X28; delay_us(); dtcount=*A0_sj;//usb對讀寫控制寫的操作,數(shù)據(jù)長度不是從0開始 choose_138(4); data_control(0); for(xh1=1;xh1<=dtcount;xh1++) { choose_138(6); jssj=*A0_sj;//獲取數(shù)據(jù) choose_138(4); *(cjsj1+xh1)=jssj; *(cjsj1+0)=xh1; } return (unsigned char)(1); } else { *(cjsj1+0)=0x0; return (unsigned char) (2); } } void T1_INT(void) interrupt 3 using 1 { EA=0; TH1=0; TL1=0; if(T_data_bz[0]==1) { T_data[0]=T_data[0]+1; //每個10.17分之一秒 自加1 T_data1[0]=T_data1[0]+1; } EA=1; } void main( void ) { AUXR=0x3; CLK_DIV=0x0; choose_138(6); //設(shè)置廠商識別碼 *A0_ml=0x12;//命令 *A0_sj=jiami1; *A0_sj=jiami2; *A0_sj=jiami1; *A0_sj=jiami2; delay_us(); //工作模式設(shè)定 *A0_ml=0x15 ; *A0_sj=0x02;//內(nèi)部固件模式 delay_us(); choose_138(4);//選擇628128 data_control(0); IE=0x0;//關(guān)閉所有中斷 TMOD=0X11;//00010001; IP=0X8; TL1=0;TH1=0; delay(1500); choose_138(4); data_control(0); IAP_CONTR|=0X40; //復(fù)位 choose_138(4); data_control(0); EA=1; ET1=1; TR1=1; for(pxh0=0;pxh0<=(*tdzs)-1;pxh0++) { write_usb_unlock(); write_usb_unlock(); ............................................ if(read_usb(jsdata)==1 && *jsdata!=0)//電腦傳送過來了數(shù)據(jù) { //其中沒有任何死循環(huán)語句 .......... } ELSE { write_usb_unlock(); } } }


volatile unsigned char read_usb(unsigned char xdata * cjsj1) { volatile char xh1=1; volatile unsigned char dtcount=0; volatile unsigned char jssj=0; choose_138(6);//ch375 data_control(0); delay_us(); *A0_ml=0x22;//寫入0x22命令 delay_us(); if(*A0_sj==0x02)//接收到批量數(shù)據(jù) { choose_138(6); *A0_ml=0X28; delay_us(); dtcount=*A0_sj;//usb對讀寫控制寫的操作,數(shù)據(jù)長度不是從0開始 choose_138(4); data_control(0); for(xh1=1;xh1<=dtcount;xh1++) { choose_138(6); jssj=*A0_sj;//獲取數(shù)據(jù) choose_138(4); *(cjsj1+xh1)=jssj; *(cjsj1+0)=xh1; } return (unsigned char)(1); } else { *(cjsj1+0)=0x0; return (unsigned char) (2); } }這是檢查pc有無數(shù)據(jù)下傳的程序!這段程序非常的差勁,原因是當初調(diào)試的時候,當執(zhí)行了dtcount=*A0_sj;語句時dtcount確實從375芯片中得到了pc端下傳的數(shù)據(jù)長度,但是當執(zhí)行了 for(xh1=1;xh1<=dtcount;xh1++) { choose_138(6); jssj=*A0_sj;//獲取數(shù)據(jù) choose_138(4); *(cjsj1+xh1)=jssj; *(cjsj1+0)=xh1;//添加獲取長度的語句 } 這些語句用以獲取pc下傳的數(shù)據(jù)內(nèi)容后,dtcount自動變成了0,數(shù)據(jù)長度又丟了,找不到原因所以又在循環(huán)中加上了 *(cjsj1+0)=xh1;這條語句,重新循環(huán)計算數(shù)據(jù)長度(這個問題的原因我一直沒有找到)。 函數(shù)的返回值也有問題,有時候明明沒有接受到數(shù)據(jù),愣是返回了1(接受到數(shù)據(jù)的標志),而查看數(shù)據(jù)時確實沒有數(shù)據(jù)。所以我覺得問題是出自這個函數(shù)!在我的程序中只有一個內(nèi)部的定時中斷開著,而且是mcu加電后一直都開著,永遠不會關(guān),當通訊中斷時定時中斷都停了。


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

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