CH592串口問題

在實際開發(fā)中使用了如下數(shù)組定義:

#define?MAX_PINS = 8

uint8_t count_8bit[MAX_PINS] = {0};

原本打算用來作為緩存,發(fā)現(xiàn)在串口接收正確數(shù)據后將需要的值寫入該數(shù)組

在程序其他地方調用時有修改了它的值,在接收數(shù)據循環(huán)處理后該值會自動重置為0x00,數(shù)據丟失了,具體調用如下:


? ? for (int i = 0; i < 8; i++) {

? ? ? ? if (pwm_pins[i] == pin) {

? ? ? ? ? ? count_8bit[i] += increment;?

? ? ? ? ? ? UpdatePWM(count_8bit[i], pin);// 可選:發(fā)送當前計數(shù)值

? ? ? ? ? ? break; // 找到對應引腳后退出循環(huán)

? ? ? ? }

? ? }

? ? UART0_SendString(count_8bit, 8);


于是另起爐灶使用其他變量就可以正常所需功能(不會在第二次串口接收數(shù)據時重置為0x00),具體修改如下:


? ? for (int i = 0; i < 8; i++) {

? ? ? ? if (pwm_pins[i] == pin) {

? ? ? ? ? ? cmd[i] += increment;?

? ? ? ? ? ? // 更新 PWM 輸出

? ? ? ? ? ? UpdatePWM(cmd[i]-0x64, pin);

? ? ? ? ? ? // UART0_SendByte(count_8bit[i]);?

? ? ? ? ? ? break;?

? ? ? ? }

? ? }

? ? UART0_SendString(count_8bit, 8);


但是如果注釋掉”UART0_SendString(count_8bit, 8);“,不打印count_8bit,串口只能接收到第一次的數(shù)據,串口第二次發(fā)送不會有任何打印,也沒有任何傳參。

并且,只能打印count_8bit,換成其他相同長度的數(shù)組、元素數(shù)值相等也會不正常,且修改為等效運行時間的DELAY延時也會不正常,只能UART0_SendString(count_8bit, 8)才能正常運行,但是這樣運行速度就太慢了,遂修改為UART0_SendString(count_8bit, 1)也可以正常運行


count_8bit是否定義到了微妙的地址?程序運行時會對該地址有操作?在操作時都關閉了中斷,操作完再打開中斷的,并且數(shù)組未越界,而且中斷也只是置標志位和把接收的數(shù)據存到buff里,并沒有延時或者長時間操作。


我不對count_8bit進行其他任何操作,只是定義并在這里UART0_SendString(count_8bit,8);才正常運行,去掉程序中及定義中的count_8bit,串口就只能收到第一次的數(shù)據,第二次收不到

找到了部分原因,在接收第二次數(shù)據時系統(tǒng)進入了死鎖狀態(tài),我不明白的是為何添加UART0_SendString(count_8bit,8);打印就不會死鎖呢?ch592的原子操作格式是什么?貌似沒有__disable_irq();__enable_irq();這樣的,只尋找到了PFIC_DisableAllIRQ();PFIC_EnableAllIRQ();這樣的函數(shù),使用該函數(shù)進行操作會有什么風險嗎?


找到了根本原因,是一個標志BOOL flag_8bit = FALSE;的操作問題,

使用了:

flag_8bit = FALSE;

HandleCount8Bit(flag_8bit == 0 ? 1 : -1,pwm_pins[i]);

以及

flag_8bit = TRUE;

HandleCount8Bit(flag_8bit == 0 ? 1 : -1,pwm_pins[i]);

去掉flag_8bit的操作,改成
HandleCount8Bit(1,pwm_pins[i]);
HandleCount8Bit(-1,pwm_pins[i]);

直接傳-1或1就可以正常運行了,也不知道為什么僅僅置位會導致死機。。。。。。把flag_8bit改成BOOLEAN也不行。。。。。。

不過最終搜索全工程找到了問題,在主程序里有調用另一個文件的函數(shù),那個函數(shù)里也有一個flag_8bit,局部變量和全局變量同名了,遂修改flag_8bit名稱,死機是不死了,但是造成了一些未知錯誤,索性全刪了,另起爐灶最終解決了問題。


三元操作以后還是減少使用,傳參和返回int有時候不考慮也會出錯,并且代碼可讀性也會降低,還有局部變量和全局變量不要重名。


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

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