標(biāo)題: STC8F單片機(jī)怎么保存串口輸入的字符串? [打印本頁(yè)]

作者: 鹿目覺(jué)    時(shí)間: 2022-10-22 15:12
標(biāo)題: STC8F單片機(jī)怎么保存串口輸入的字符串?
就是通過(guò)單片機(jī)串口讀取輸入的字符串,然后保存起來(lái)(斷電不丟失),再通過(guò)串口發(fā)送回去。
我用EEPROM,怎么都搞不成功

作者: 鹿目覺(jué)    時(shí)間: 2022-10-22 15:13
字符串保存和發(fā)送的時(shí)候怎么處理?我的要么是發(fā)送回去?????要么是////////
作者: lkc8210    時(shí)間: 2022-10-22 20:44
接收數(shù)據(jù)
順序?qū)懭刖彌_數(shù)組
檢測(cè)有否超時(shí)
寫(xiě)入EEProm
順序發(fā)送數(shù)據(jù)
作者: 鹿目覺(jué)    時(shí)間: 2022-10-22 21:10
lkc8210 發(fā)表于 2022-10-22 20:44
接收數(shù)據(jù)
順序?qū)懭刖彌_數(shù)組
檢測(cè)有否超時(shí)

我不知道為什么:
接收數(shù)組receive[],緩存數(shù)組save_number[]。
for(i=0;;i++)
{
save_number[i ] = receive[i ];
if(receive[i ] == '\r')
{
break;
}
}
然后把save_number一次保存到EEPROM中
具體就是
addr = 0X0A00;
for(j=0;;j++)
{
Iap_Write(addr,save_number[j]);
if(save_number[j] == '\r')
{
break;
}
addr++;
}

寫(xiě)完以后
addr = 0X0A00;
for()
{
DAT = Iap_Read(addr);
Send_Dat(DAT);
if(DAT == '\r') {break;}
addr++;
}
這樣發(fā)出來(lái)的數(shù)據(jù),個(gè)數(shù)上對(duì)的上,但是都變成了????,比如發(fā)送ABCD1234變成了????????,發(fā)送123456,變成了??????,改了半天,成功讓?變成了/

作者: 188610329    時(shí)間: 2022-10-22 22:02
先全收下,然后寫(xiě)eeprom,讀也是,先全讀出來(lái),再一起發(fā)出去。
作者: lkc8210    時(shí)間: 2022-10-23 22:55
鹿目覺(jué) 發(fā)表于 2022-10-22 21:10
我不知道為什么:
接收數(shù)組receive[],緩存數(shù)組save_number[]。
for(i=0;;i++)

寫(xiě)入前沒(méi)有刷除?
作者: wufa1986    時(shí)間: 2022-10-24 08:21
EEPROM寫(xiě)一次耗時(shí)太大了,如果用內(nèi)部的EEPROM,還要關(guān)中斷,所以失敗是必然
作者: 624353765    時(shí)間: 2022-10-24 08:24
http://www.torrancerestoration.com/bbs/dpj-223265-1.html
推薦使用這款軟件生成
雖然還沒(méi)做到STC8F系列,但是使用STC12C5A60S2系列型號(hào)生成的EEPROM操作函數(shù)是一樣的自帶很詳細(xì)的例程,操作簡(jiǎn)單方便





作者: coody_sz    時(shí)間: 2022-10-24 10:01
參考、測(cè)試STC官方的EEPROM例子
作者: 鹿目覺(jué)    時(shí)間: 2022-10-24 11:31
lkc8210 發(fā)表于 2022-10-23 22:55
寫(xiě)入前沒(méi)有刷除?

刪除了,程序部分寫(xiě)在下面了,能幫忙看下哪里出問(wèn)題了嗎?
作者: 鹿目覺(jué)    時(shí)間: 2022-10-24 11:32
本帖最后由 鹿目覺(jué) 于 2022-10-24 11:34 編輯

void Send_Data(char dat)
{
        ES=0;
        IE2&=~(1<<0);
        SBUF=dat;
        S2BUF=dat;
        while((!TI)||(!(S2CON & 0x02)));
        TI=0;
        S2CON &=~(1<<1); //S2TI = 0;
        ES=1;
        IE2 |= (1<<0);
}
void Send_String(char *s)
{
while(*s)
{
Send_Data(*s++);
}
}

void Write_SN()
{
        SN_addr = 0xA00;
        Send_String("WSN_OK\r\n");
        for(k = 4;;k++)
        {
                IapErase(SN_addr);
                IapProgram(SN_addr,receive_number[k]);
                if(receive_number[k] == '\r')
                {
                        break;
                }
                else
                {
                        SN_addr++;
                }
        }
        Send_String("wsn_ok\r\n");
}


void Read_SN()
{
        SN_addr = 0x0A00;
        for(j = 0;;j++)
        {
                sn_number[j] = IapRead(SN_addr);
                if(sn_number[j] == '\r')
                {
                        break;
                }
                else
                {
                        Send_Data(sn_number[j]);
                        SN_addr++;
                }
        }
        Send_String("\r\n");
}

作者: 鹿目覺(jué)    時(shí)間: 2022-10-24 11:38
發(fā)送數(shù)據(jù)的函數(shù)是沒(méi)問(wèn)題的,應(yīng)該問(wèn)題就出在存和讀的部分,我還在程序別的地方保存和讀取了別的數(shù)據(jù),是int類型的就可以正常存讀,不知道為什么字符串就不行。
作者: 大漠孤煙001    時(shí)間: 2022-10-26 12:04
我習(xí)慣用S T C開(kāi)發(fā)工具包里面的范例程序,稍微修改直接調(diào)用很方便

SM7[YFH[S[O9D6N~)M928%7.png (76.04 KB, 下載次數(shù): 32)

SM7[YFH[S[O9D6N~)M928%7.png





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1