久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機程序如何做穩定的經驗1 [打印本頁]

作者: net2uizoo    時間: 2020-12-16 13:47
標題: 單片機程序如何做穩定的經驗1
1.中斷和 main函數或其子函數 里不要同時有同一外設模塊信號的操作,如對74hc595的操作,對HT1621B的操作的信號線必須是有序的,而不能穿插,否則容易錯亂或花屏
2.中斷里標志位變化時,回main函數或其子函數后盡量再判斷標記位,否則容易導致遺傳上次標志位的作用,而沒有及時發現中斷返回后標志位已改變,而導致程序混亂
3.類似于信號量臨界區的穩定性處理
4.對所有死等待如等待某標志位 ,做超時退出處理,防止卡死
5.所有數組下標盡量在訪問數組前都做下標是否越界判斷
5b.做除零異常判斷,如果分母為零就不除
5c.注意:如果程序里有很多個定時器或多個高速外部中斷在工作,而且定時頻率都很高,那么如果棧空間分配很小,那么很容易發生嵌套的多層次搶占中斷而在進入中斷函數時發生局部變量分配儲存空間時失敗即堆棧溢出,而導致死機和卡死!,盡量
把功能用分支if做到1個定時器中斷里,少用定時器,并盡可能減小定時器頻率,并盡可能加大棧初始化空間,如stm32單片機里 .s 文件里的一些定義
6.對于一些潛在的不穩定因素(甚至1-2個月才出現一次故障),比如網絡忙時包ID的先后次序發生變異,而導致if xxxx.id>old.id 永遠無法再成立而卡死
7.多機通信盡量用單向通信,比如主從模式,主機發包輪詢查詢并從機返回結果模式,雙向的全雙工通信模式的穩定性比較差
8.所有按鈕處理必須做按鈕去抖動算法,甚至不是阻塞式延時式的去抖動算法,而是狀態機時的異步流程方式的過濾掉按得過快的2次按鈕事件間隔,比如200ms內再無按鈕事件且按鈕已沒按住才算按了1次,而且最好加個104電容在按鈕里并聯
9.多機主從通信盡量用 目的機ID+通信協議版本號+分包的子包ID序號(如1-10)+子包總數+本子包數據長度+上次包的全局ID+crc32校驗,方式來處理重復包,30ms內沒收到從機反饋數據則重發包(比如重發4-6次)來處理丟包,并當上次包的全局ID大于一定值時發清零包ID的cmd包來復位ID計數,但要判斷從機先收到大點的ID的包的情況
10.網口通信比usb通信穩定,usb在干擾時容易掉線
11.TF卡只適合做只讀的fat32文件系統應用,如要常寫入,最好配合 W25q64來固定分片方式的無fat32文件系統式的寫入,因為TF卡常寫入,容易寫壞文件系統格式,比如意外掉電時等
12.對于一些串口接口的模塊,如果波特率用得太大,則單片機容易串口中斷響應不過來,而發生嵌套的異常串口中斷,或丟串口數據,導致通信不穩定,波特率最好低點!
13.單片機程序的架構最好做成異步式的狀態機式的虛擬多線程方式,不要用任何阻塞式的死等待和延時,延時也要做成狀態機里的某個狀態的delay的異步非阻塞式的累加,加到一定值才進入下1個狀態碼,異步方式比阻塞式的方式的穩定性要好,處理實時性也高,多級菜單的屏幕顯示和按鍵處理也可以用狀態機式的異步流程,有個狀態碼指示當前菜單的第1級選擇項號,選擇深度,第2級選擇項號。。。。
14.相同的類似的屬于同一功能概念下的處理過程最好集成到一個函數里做分支判斷,而不要把1個功能分散到很多個函數里,這樣代碼比較難維護和二次修改
15.可以抽象為1個功能或1個流程體內的東西最好歸納法和抽象法抽象一下,不要做成if分支遍歷和窮舉所有情況方式,就像要做成矢量圖,而不是像素圖,抽象概括后的代碼寫法更有簡潔性,更
有可維護性和穩定性!
15b.復雜度盡量做成可配置數組里的數據,用配置數據來展開對代碼的控制,而不是把復雜度全部映射到代碼if分支等分支上,就像要做成矢量圖,而不是像素圖,就像一個圖形圓在可配置數組里(矢量圖里)是 yuan_type和sin cos,而若是代碼分支法,則是一堆關于圓的點陣

15c.按15點所說的抽象和歸納代碼后的代碼簡潔化和可維護性加大化,可以使代碼的條理和邏輯層次更加清晰,使更容易分析和預感到可能的bug和細節邏輯不嚴謹,從而預防bug和不穩定性bug,最終影響程序運行時穩定性,所以bug是由思維決定的


16.看門狗在程序完工后最好加上去,軟件里的關鍵數據最好做RAM區多處備份,如備份10份,死機自動復位恢復后,檢查RAM區里備份里的各備份,重復次數最高的那幾份備份(且重復次數在6次以上)最可能為原始未被破壞的數據,并做個ram標志位檢查是上電復位,還是看門狗復位,復位后可以做不清除ram數據,程序跑飛后,可以提前做些標志位判斷,如跑飛到某處,可能某標志位未被置位卻執行到這,則可以自動判斷出是已跑飛,則自動軟件復位一次!

17.
單片機芯片的最近的外圍一圈上的單片機芯片vdd,gnd引腳附近必須多弄幾個0603封裝的貼片104電容來去干擾,pcb電源類走線的線寬必須要寬,至少0.4mm以上,甚至0.8mm以上,單片機芯片在pcb局部時盡量靠近電源芯片和供電芯片處

就單單才零點幾歐電阻的導線稍微長點來傳輸電源,比如20cm長,就會導致高頻雜波變多,所以導線末端務必加470uf以上的電解電容來去耦濾波,可以想象,在單片機引腳周圍1圈上也應該最好加上幾個470uf電容和104電容環繞
;大功率pcb供電線走線千萬不要在單片機周圍走線或走過單片機,一定要把大功率電源的輸入接口做在大功率電路部分的附近,避免電源線的長距離走線!,要走也不要在單片機外周走過!,且大功率pcb供電線走線要邊走線邊1路隔個幾段距離就加個104去耦電容



18.
如果是軟件模擬spi信號接口或i2c接口,那么字節發送函數里最好先禁止總中斷使能,發完后再開啟總中斷使能,否則容易不穩定

19.
c8051f340單片機芯片工作時如果電源電壓比較低或有突然的電源脈沖浪涌干擾,容易使燒好的程序丟掉,穩定性好像不怎么好,stm32單片機芯片或GD32芯片好像就好點,就沒這個問題!,推薦優先選后者

20.
對于以太網網絡模塊芯片應用,最好把這芯片的RST復位信號接到單片機上,并RST腳接個104電容(有時候干擾容易導致意外硬式復位,而反而不穩定),這樣,網絡卡死時可以強制復位網卡芯片一次來修復

21.
lwip等網絡協議棧的某些版本有可能有內存泄露bug,或長時間運行后卡死,最好做定時自動軟件復位單片機功能,來防止內存泄露過度

22.
芯片上如果flash夠,最好做從服務器查詢新版BIN固件來自動升級單片機自身的hex固件功能(固件下載完要做CRC32校對),以及usb的固件升級功能,即net bootloader和usb bootloader,來應對【做項目即使完成和驗收后,幾個月出現的bug要修復,而措手不及】


23.
比如 休眠后喚醒時給PB1引腳1個高電平后不明原因的死機,不一定是進入未定義中斷,而是main函數之前bootloader對PB1響應:主程序進入休眠態,喚醒后 pb1為高,進入bootloader態,但bootloader里沒有重新初始化stm32 cpu的時鐘系統等,故卡死,雖然bootloader后跳轉到的main里有重新初始化stm32 cpu的時鐘系統等的代碼,但是已執行不到


24.
密腳芯片單片機等ic焊接時上松香吸錫后,如果用酒精清洗,是否過幾個月后會發生引腳間松香,助焊劑等物質發生變質而短路?而不穩定?

25.
故障實時監測功能很重要!(備災1):比如某stm32版的帶網口的板子做個板子是否在線監測和掉線時短信提醒功能,即每10秒鐘發送1個心跳包給服務器,如果服務器50秒內沒收到某板子的任何心跳包,則此板子判為已掉線,并發送報警短信,email給對應的技術員來通知處理和修復

26.
同一個安裝點上弄多個冗余板子,某塊故障時,另1塊自動切換到上線!,或雙電源,1個后備電池逆變電源,主電故障則自動切換到備電(備災2)

27.
電源接插頭不要用圓孔的那種電源插座或usb接口插座,要用專用的接線端子母座和接線端子插頭(綠色方形的帶2針的那種,最好還帶上扣機制,插緊后自動上扣),否則電源不穩或接觸不良,導致板子掉程序或其他異常,信號線也可以如此處理


28.
回流焊最后1段溫度曲線的達到最高溫度時如保持時間過長(推薦205度保持15秒,對于無鉛錫膏)導致錫膏被烤干,或錫膏過期了,就會導致出來后焊接效果不好,比如焊盤上錫的亮度不高,無光澤,太干燥,這時容易影響產品性能和加速日后的產品性能衰變

29.
eeprom寫入前不需要擦除整個扇區,比如at24c02之類的,而單片機自帶的flash和w25q64等都是flash,寫入前如果不擦除整個扇區,可能部分字節會寫錯字節,而導致異常和不穩,或者做了擦除處理,但是寫某個數據時
未備份扇區里原數據而直接擦除扇區,導致數據丟失,比如要寫入的數據數組跨越了2個扇區的邊界的情況

30.
盡量不要用一些外置的什么is62lv256+ls373方案的擴展ram內存方式,而要直接用自帶高ram大小的192K ram的單片機,比如stm32f407或stm32f103zet,stm32103re ,gd32f103cb等,因為外擴方式容易不穩定,比如受焊接質量,打板精度,環境濕度溫度,電源波動等影響
而不穩


31.
遞歸函數盡量用while/for循環+棧或數組或鏈表的方式來替代,而不要做成多層次調用函數自身方式的遞歸,做也做成帶遞歸深度變量的,限制最大遞歸深度,否則容易堆棧溢出而死機

32.
當要進行可能的后果極其危險或非常重要,不能被任何干擾誤觸發的控制操作時(比如房屋爆破隊驅動炸藥點火的裝置,自動駕駛的緊急剎車制動驅動器,高壓總閘開關繼電器),務必要備份10份以上的
控制碼,如果只有1份控制碼,當這份控制碼被強干擾信號改變內存數據而變為導致觸發的目標控制碼時,就會誤動作,而如果是10份,會校驗所有10份控制完全一致后再打開控制,這樣只有1份或2份被干擾
后就不會誤動作了,所有內存區的任何變量也都實時備份10份以上,這樣被干擾后可實時恢復正確的數據(殘留下的重復次數最多的那幾份且重復次數在6次以上即為未破壞數據),
當10份備份中重復次數在6次以下,意外著系統也無法自己自我修復,就會自動進入崩潰狀態或自動軟式復位,
再進行重要控制或驅動前,也檢查所有內存區的各變量的實時備份的10份數據,如果任何一個變量的10份備份中各數據間重復次數在6次以下,則意外著干擾太強了,系統已錯亂,則不繼續進行重要控制或進行驅動。
,進行i/o控制的代碼最好在前面多加幾百行陷井代碼和判斷是否已被干擾弄崩潰的代碼,來盡可能減少意外直接跑飛到【進行i/o控制的代碼】的概率,或者不用任何簡單的i/o來控制重要設備或高壓的重要設備,
而用i2c或spi接口的外圍驅動芯片來間接控制,且i2c或spi必須為軟件模擬,在i2c或spi的發字節函數里,每發1個比特就再判斷一次【是否已被干擾弄崩潰即檢查所有變量的10份備份是否還算完整和一致】,
這樣就非常可靠和穩定,不會被強干擾弄誤觸發了!


33.
在存在強電流,強功率,強電壓,強靜電,強射頻耦合傳遞,或可能有接觸式火花的地方盡量多的加光耦隔離來隔離信號控制計算處理部分和高壓信號驅動部分,如果一個系統上存在2個或以上獨立供電電源,
相互之間也必須完全隔離(GND等都不要接一起),用光耦耦合來傳遞控制,
繼電器盡量換為可關閉的晶閘管,或場效應管,或其他大功率開關管,這些控制開斷時有【無火花】的優點,防止繼電器通斷時的火花放電間隙導致的強干擾,如果實在要用繼電器,在繼電器的2觸點引出腳間接入RC去火花電路,
,并在繼電器的2觸點引出腳控制的真空電磁閥或電機等感應負載上反向并聯入【1個高耐壓二極管+串1個0.5歐左右的大功率電阻】,以及并聯入1個體積大的104電容,來去除真空電磁閥或電機等在斷電瞬間產生的
反向電動勢,從而消除反向電動勢在繼電器觸點剛斷開時的微小間隙里產生火花,從而消除火花產生的強干擾來使單片機跑飛,死機或復位的后果,


,另外如果用繼電器,最好每個繼電器的VCC串1個10歐的電阻后再控制繼電器,這樣繼電器吸合時對電源的脈沖干擾小點!


34.
做編程項目或電子項目,務必做一個 發現的未解決的程序bug的備忘.txt ,及時記錄發現的偶爾出現的bug,和突然靈感里閃現的預感到的可能會出現的bug情況,以及要改進的地方,
比如一些操作不變雞肋問題,穩定性問題,都要及時記錄,因為如果每忘記1點點bug,都意味著可能日后會出現這個bug,即導致項目的徹底失敗,畢竟【一個項目的成功是靠堵住所有一些可能的細節蟲洞和雞肋來做到的】

35.
如果是在別人的開放平臺或接口上做程序,那么需要定期檢查所有情況都是否正常,比如即使今天全部正常,但是他們平臺也許早就換了接口版本,只是老用戶還是維持老版本接口,新訂購的用戶用我們isv軟件時卻已切換到新接口,不能用,卻發現不了

36.
字符串數組即二維的uchar數組,在定義時,前1個方括號索引字符串序號,后1個方括號索引當前字符串的字符下標,比如u8 wavfile1n[7][15] 代表7個最長14個字符的字符串,方括號別弄反了,容易異常


37.
板子上電源處加的電解電容在1000uf以上時,容易上電時電容瞬間電流過大而導致開關電源發生短路保護,如此循環,而不易啟動


38.
EMI:pcb電源輸入部分增加共軛電感器抑制中高頻的共模噪聲,并加共模濾波電容(2個電容串聯,2端接電源正負,中間點接地)和差模濾波電容

39.
如果要抗雷擊浪涌,應在電源輸入處并聯入動作電壓大于額定電壓2-3倍以上的壓敏電阻,并且電源輸入處pcb走線寬度要粗,并電源輸入處的壓敏電阻前的走線串聯入玻璃保險管的座的相關元件

40.
pcb信號線的走線盡量短而且寬: pcb布線時選擇合理的導線寬度 由于瞬變電流在印制線條上所產生的沖擊干擾主要是由印制導線的電感成分造成的,因此應盡量減小印制導線的電感量。印制導線的電感量與其長度成正比,與其寬度成反比
晶振走線必須盡量短:           時鐘線、信號線也盡可能靠近地線,并且走線不要過長,以減小回路的環面積
信號線走線拐角應采用圓弧形:   電路板上的印制線寬度不要突變,拐角應采用圓弧形,不要直角或尖角。(9)時鐘線、信號線也盡可能靠近地線,并且走線不要過長,以減小回路的環面積。
保持環路面積最小,降低干擾對系統的影響,提高系統的抗干擾性能。并聯的導線緊緊放在一起,使用一條粗導線進行連接,信號線緊挨地平面布線可以降低干擾。電源與地之間增加高頻濾波電容
采用完整的地平面設計,采用多層板設計,鋪設地層,便于干擾信號泄放。

41.
密腳芯片懷疑存在連焊時的處理技巧1:拖焊時務必放很多松香到吸錫銅絲線上,否則容易吸錫不徹底,而留下ic引腳間不穩定性的短路問題,最后用99%濃度(不能含水多)的酒精擦去殘留的松香,并再烙鐵順引腳刮下來清理一遍酒精等


42.
盡量用全局變量或全局數組變量替代局部變量,因為進入函數時要不斷的分配局部變量,容易影響執行效率和耗用完堆棧空間等;

43.
電源部分的正常和穩定(比如電壓波紋小,高頻噪聲濾除率高,功率實足,抗突變的浪涌大電流能力強)是單片機電路和控制電路穩定工作的最重要的前

44.
像LM1086-3.3或LT1086-3.3,LMXXXXX....之類的貼片式三端穩壓器,在貼片工藝完后并過回流焊爐后,由于焊盤上印刷錫膏時錫膏量不足或者三端穩壓器引腳上翹會導致三端穩壓器過回流焊爐焊接后存在虛焊或接觸不良,
所以應該每次都手工補焊下來補點錫,否則容易不穩定,或在電子產品運輸工程中脫焊而開路
sot23封裝的貼片三級管也容易引腳上翹而導致回流焊的焊接質量不良而導致開路或虛焊(如在運輸過程中振動而脫焊)

45.
所以出廠前的24h老化測試和pcb帶電工作的高強度振動測試也很重要,來檢測是否有虛焊的現象(如在運輸過程中振動而脫焊)

46.
電源開關等不要用機械式的單刀雙擲式的那種微型撥動開關,很容易損壞或接觸不良,最好做成自鎖式的那種按鈕式電源開關或船型開關


47.
注意場效應管的前置驅動電壓放大級用的三極管的發射極最好是接地形式的而場效應管G端接三極管的集電極再1個上拉電阻上拉到比如24V,否則如果NPN的發射極接G端時,當三極管導通,
發射極的電壓最大也只有基極的電壓的大小,將無法良好的使場效應管完全導通,比如IRF540N的Vgs需要10V左右才完全導通,另外應該在G端對地并聯1個10V穩壓管,因為一般Vgs也不能太大,20V左右最大了

不要用單片機IO口直接驅動場效應管,因為一般場效應管Vgs在10V左右才能完全導通和飽和,單片機io口電壓不夠,會驅動不良

48.
光耦存在壽命,所以盡量用非光耦的取代元件來做隔離,比如一些ic:
光耦中的發光二極管隨著時間推移而老化;比如開關電源反饋環路中光耦老化,傳輸比下降后可能引發故障。
不能用線性光耦作為模擬量傳感:通光耦產品手冊中對電流傳輸比只給出一個大概的范圍(從低到高可以差別一倍),而且沒有給出溫漂和老化的指標。用于開環傳輸模擬量,精度是得不到保證的,所以導致過壓、過流,以致損壞

49.
74hc595的時鐘和數據線上要加阻容濾波的  這類IC  速度太高   對毛刺干擾特別敏感,而導致誤動作或屏幕錯亂

49a.
做電壓檢測電路時,比如測220V電壓或380V電壓,不要用線性光耦+1M電阻來降壓采樣,而要用微型工頻變壓器(鐵芯那種(非高頻磁芯))來降壓并整流采樣,因為光耦會老化和被擊穿(雷擊等意外),或有溫飄

50.
不要在任何中斷函數里調用1個需要等待另1種中斷函數來置位目標所需標志位才能結束的函數或代碼段,否則可能因為中斷優先級的關系而導致這另1種中斷函數永遠無法執行而卡死在等待里,導致死機

51.
謹慎使用keil自帶的庫函數之sprintf和printf,容易出問題,比如卡死或內存泄露

52.
LQFP64/LQFP48之類的密腳IC如果用拖焊法手動焊接,那么如果芯片在pcb上的每個引腳的焊盤的長度如果比較長,則很容易拖焊后在引腳的焊盤的靠芯片內部方向處產生錫的殘留而導致2個引腳焊盤間的短路,所以
此法不穩定,還是用鋼網刷錫膏+回流焊法比較可靠!




53.
ad采樣均值濾波法時應該用:

               
                        chindex=0;
                        
                        
                        
                        
                        
                        
                          memcpy(&ch_vout1_lvbo_temp[0],&ch_vout1_lvbo[chindex][1],(junzhi_lvbo_count-1)*sizeof(float));
                        
                                memcpy(&ch_vout1_lvbo[chindex][0],&ch_vout1_lvbo_temp[0],(junzhi_lvbo_count-1)*sizeof(float));
                        
                        
                        ch_vout1_lvbo[chindex][(junzhi_lvbo_count-1)]=read_adc_value();
                        
                        
                if(ch_caiyang_alled[chindex]==0){
               
                        ch_vout1_lvbo_index1[chindex]++;
                        if(ch_vout1_lvbo_index1[chindex]>=(junzhi_lvbo_count)){
                                
                                ch_caiyang_alled[chindex]=1;
                        }
                        
                }
        

這樣的代碼機制,而不是插滿一次緩沖池后從頭開始覆蓋,而是不斷往前移1格來不斷的從緩沖池的末尾插入,而且memcpy時注意是(junzhi_lvbo_count-1)*sizeof(float)個字節,而不是(junzhi_lvbo_count-1)個


54.
數字電源或開關電源的mos管的驅動級的信號輸入最好帶一級最大高電平時間限制的硬件式電路,比如最大允許高電平500us,來防止卡死時一直高電平而使mos一直導通而燒壞mos或高頻變壓器!


55.
注意臨界大小判斷時容易出現的bug:
        if((ch_vout1_zhankongbi_value1+diff_v1)<=max_zhankongbi1){
         ch_vout1_zhankongbi_value1=ch_vout1_zhankongbi_value1+diff_v1;               
        }

,這里,如果diff_v1很大,但是ch_vout1_zhankongbi_value1+diff_v1剛好只比max_zhankongbi1大1,那么就會陷入死循環,永遠無法達到max_zhankongbi1,而且不是只離max_zhankongbi1一點,容易使調節環在誤差比較大時卡死
,所以要加else來改為:
        if((ch_vout1_zhankongbi_value1+diff_v1)<=max_zhankongbi1){
                ch_vout1_zhankongbi_value1=ch_vout1_zhankongbi_value1+diff_v1;               
                 }else{
                ch_vout1_zhankongbi_value1=max_zhankongbi1;
                                                         
                 }


56.
數字電源的每次反饋調整pwn或每次pid調整時的調整間隔周期必須在相隔500us左右以上而不是1個while死循環里不停的調整,
而要用timer定時定間隔的調(所以輸出級的電解電容務必2200uF以上,來延長電壓突變緩沖時間),而且每次調整的誤差比例乘積因子必須要小,否則容易輸出電壓波紋很大!
控制輸出電壓波紋的關鍵是這500us內不斷的采樣adc(可多次DMA式adc)來累加并在500us結束時取累加值的平均值來數字濾波,因為一般ad采樣電壓的波紋比較大


57.
keil中 3.11/6.1會被當做小數來計算結果,如果是3/23,則結果為0,因為被當做整數來處理,所以必須寫為(float)3.0/(float)23.0

58.
如果需要動態改變單片機定時器的定時周期,那么要注意周期定時值不能被改的太小,否則會導致不斷的高速的進入定時中斷而卡死,要判斷和限制下


59.
【bug調試和發現bug原因,解決問題現象】的原則是【在相對系中尋找局部絕對系來作為支撐點,進而慢慢全部覆蓋問題機制】,比如找幾個確定點和可以差量法,對比法確定的程序現象和機理,然后再慢慢消元,減少變化量的個數,盡量避免多個量
一起在變的問題框架,因為變量1多,要測試的樣本就成指數級增長!


60.
c#上位機程序防卡頓經驗1:
阻塞式的任務和代碼要全部在后臺線程里獨立運行,而不能在主界面的主線程里執行,對于后臺線程里要跨線程操作主界面控件的,這段操作界面的代碼要用到Invoke,相當于卡死界面一點時間,所以在
Invoke里調用的 Action<string> actionDelegate3 = (x) =>{。。。。}之類的里的代碼盡量執行時間耗時極短,比如盡量把界面控件某狀態的死等待代碼不要放在Invoke的執行體代碼里,
比如 while ((int)(webb1.Tag) == 0 || webb1.IsBusy == true) { System.Threading.Thread.Sleep(10); }這段等待webbrowers加載網頁完畢的代碼不要放在Invoke的執行體代碼里,而放在
線程代碼里,即Invoke的執行體代碼執行完后的緊接著的下一句代碼再執行 while ((int)(webb1.Tag) == 0 || webb1.IsBusy == true) { System.Threading.Thread.Sleep(10); }
,而Invoke的執行體代碼里如果執行webbrowers1.Navigate(aaa1.url);之類的,也會在打開網頁時卡頓一段時間界面,所以盡量改為異步方式的Navigate函數,比如BeginNavigate()之類的

61.
C#里等待webbrowser是否加載網頁完成的穩定可靠的檢測方法為:延時式再判斷累計法(注意:線程里讀webbrowser的Isbusy值時要用Invoke,否則容易出錯):

                      int kongxianed = 0;
                      while (true)
                      {

                          System.Threading.Thread.Sleep(100);
                          bool isbusy1=true;


                          Action<string> actionDelegate3a11 = (x) =>
                         {
                             isbusy1 = webb1.IsBusy;
                         };

                          webb1.Invoke(actionDelegate3a11, "");


                          if (isbusy1 != true)
                          {
                              kongxianed++;

                          }
                          else
                          {
                              kongxianed = 0;

                          }

                          if (kongxianed > 20)//如果2秒內都無Busy狀態再出現,那么極有可能網頁和其所有網頁子框架都已加載完成
                          {
                              break;

                          }


                      }


62.
c#里容易異常的地方和一些界面控制代碼外圍盡量包1層try ...catch,來防止崩潰出錯

63.
c#里object 不能直接隱式轉為int,而要先tostring()后再int.parse?


64.
js里的ajax里提交后盡量加&r="+Math.random()后綴來防止緩沖而不更新

65.
路徑可能變動的網頁里的帶背景img定義的css盡量不要放在網頁里,而放在一個外部css文件里,這樣圖片可以相對css文件來定義路徑

66.
對于ajax點擊鏈接執行函數但不跳轉,建議不要用href:void(0)...+onclick(兼容性不好,有些瀏覽器異常打開新窗口),而用div+onclick+div加手型鼠標css
,而且onclick所在div要顯式定義好height和width,否則容易兼容性不好,而有的瀏覽器點擊無響應!
Example:CSS鼠標手型效果 <a href="#" style="cursor:hand">CSS鼠標手型效果</a>
Example:CSS鼠標手型效果 <a href="#" style="cursor:pointer">CSS鼠標手型效果</a>
注:pointer也是小手鼠標,建

另外免費招單片機徒弟一起學習交流,看我頭像





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久综合久色欧美综合狠狠 | 日韩成人av在线播放 | 国产中文区二幕区2012 | 久久一二 | 国产视频久久久 | 最新国产精品精品视频 | 国产福利二区 | 免费黄色大片 | 久久里面有精品 | 91毛片网| av中文字幕在线观看 | 免费视频一区二区 | 欧美成人h版在线观看 | 亚洲精品久久久一区二区三区 | 欧美黄色一级毛片 | 亚洲一区二区三区四区av | 久久久久久久久久久一区二区 | 欧美日韩视频网站 | 91精品亚洲| a级黄色毛片免费播放视频 国产精品视频在线观看 | 欧美一区二区三区久久精品 | 欧美一区二区在线播放 | 欧美视频一级 | 秋霞在线一区二区 | 福利视频一区二区三区 | 蜜桃视频成人 | 一区二区三区视频在线观看 | 久久久福利 | 久久99视频 | 高清一区二区三区 | 午夜影院在线 | 精品亚洲一区二区三区 | 成人在线免费观看 | 日韩在线中文字幕 | 欧美日韩一区二区三区四区五区 | 一二区视频| 九九久久国产精品 | 综合久久综合久久 | 久久香蕉网 | 在线免费观看黄视频 | 97国产在线视频 |