找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1359|回复: 12
收起左侧

STC8F单片机怎么保存串口输入的字符串?

[复制链接]
ID:1038251 发表于 2022-10-22 15:12 | 显示全部楼层 |阅读模式
就是通过单片机串口读取输入的字符串,然后保存起来(断电不丢失),再通过串口发送回去。
我用EEPROM,怎么都搞不成功
回复

使用道具 举报

ID:1038251 发表于 2022-10-22 15:13 | 显示全部楼层
字符串保存和发送的时候怎么处理?我的要么是发送回去?????要么是////////
回复

使用道具 举报

ID:161164 发表于 2022-10-22 20:44 | 显示全部楼层
接收数据
顺序写入缓冲数组
检测有否超时
写入EEProm
顺序发送数据
回复

使用道具 举报

ID:1038251 发表于 2022-10-22 21:10 | 显示全部楼层
lkc8210 发表于 2022-10-22 20:44
接收数据
顺序写入缓冲数组
检测有否超时

我不知道为什么:
接收数组receive[],缓存数组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++;
}

写完以后
addr = 0X0A00;
for()
{
DAT = Iap_Read(addr);
Send_Dat(DAT);
if(DAT == '\r') {break;}
addr++;
}
这样发出来的数据,个数上对的上,但是都变成了????,比如发送ABCD1234变成了????????,发送123456,变成了??????,改了半天,成功让?变成了/
回复

使用道具 举报

ID:624769 发表于 2022-10-22 22:02 来自手机 | 显示全部楼层
先全收下,然后写eeprom,读也是,先全读出来,再一起发出去。
回复

使用道具 举报

ID:161164 发表于 2022-10-23 22:55 | 显示全部楼层
鹿目觉 发表于 2022-10-22 21:10
我不知道为什么:
接收数组receive[],缓存数组save_number[]。
for(i=0;;i++)

写入前没有刷除?
回复

使用道具 举报

ID:879348 发表于 2022-10-24 08:21 | 显示全部楼层
EEPROM写一次耗时太大了,如果用内部的EEPROM,还要关中断,所以失败是必然
回复

使用道具 举报

ID:526108 发表于 2022-10-24 08:24 | 显示全部楼层
http://www.51hei.com/bbs/dpj-223265-1.html
推荐使用这款软件生成
虽然还没做到STC8F系列,但是使用STC12C5A60S2系列型号生成的EEPROM操作函数是一样的自带很详细的例程,操作简单方便

AIOOF0SB004XE5UO_I@%$[M.png


回复

使用道具 举报

ID:1034262 发表于 2022-10-24 10:01 | 显示全部楼层
参考、测试STC官方的EEPROM例子
回复

使用道具 举报

ID:1038251 发表于 2022-10-24 11:31 | 显示全部楼层
lkc8210 发表于 2022-10-23 22:55
写入前没有刷除?

删除了,程序部分写在下面了,能帮忙看下哪里出问题了吗?
回复

使用道具 举报

ID:1038251 发表于 2022-10-24 11:32 | 显示全部楼层
本帖最后由 鹿目觉 于 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");
}
回复

使用道具 举报

ID:1038251 发表于 2022-10-24 11:38 | 显示全部楼层
发送数据的函数是没问题的,应该问题就出在存和读的部分,我还在程序别的地方保存和读取了别的数据,是int类型的就可以正常存读,不知道为什么字符串就不行。
回复

使用道具 举报

ID:1042619 发表于 2022-10-26 12:04 | 显示全部楼层
我习惯用S T C开发工具包里面的范例程序,稍微修改直接调用很方便
SM7[YFH[S[O9D6N~)M928%7.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表