完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
实验目的:
学习I2C的硬件知识,并配置E2PROM,进行数据的储存器通讯。使用储存器时CPU可执行其他操作,即储存器不占用CPU 实验要求 实现串口发送数据,存储器保存,并能正确读出(e2prom或者flash选择其一方式实现),本程序使用的是e2prom,由于开发板引脚资源紧张使用的为软件I2C。 能成功编译例程代码,并下载运行与实验目的相同 串口发送不定长数据帧格式形如:“ip:192.168.1.23 port:3450 #”。能正确解析出ip和端口号并保存,其中ip和port不区分大小写 实验结果 部分代码展示 int main(void) { LED_GPIO_Config(); /* 串口初始化 */ USART_Config(); i2c_CfgGpio(); printf("本程序根据STM32f10xMINI例程修改rn程序去区分大小写rn程序实现串口通信读取ip和portrn"); //串口输入:ip:123.123.12.3 port:123 IP:234.234.234.23 PORT:234 Ip;345.345.34.45 PORT:345# while(1) { uint16_t i,j,DataNum=0; //定义变量i,j用于遍历整个数组,DateNum用于记录数据组数 uint8_t write_buf[EEPROM_SIZE]; //定义写入数据的数组缓冲区,根据I2C的硬件要求只能存储256个字节 uint8_t read_buf[EEPROM_SIZE];//定义读数据数组缓冲区 if (ee_CheckDevice(EEPROM_DEV_ADDR) == 1)//判断E2PROM是否存在,不存在跳转至wrong(此时程序暂停) { goto wrong; } /*------------------------------------------------------------------------------------*/ /* 填充测试缓冲区 */ for (i = 0; i < EEPROM_SIZE; i++)//通过串口输入数据到写入数组中 { write_buf = getchar(); if(write_buf == '#') { break; } } /*------------------------------------------------------------------------------------*/ if (ee_WriteBytes(write_buf, 0, EEPROM_SIZE) == 0)//调用多字节输入(页写入),第一个变量为写入的数据,第二个为读出数据的地址从何开始,第三个为需要读出总数数据的长度 { goto wrong; } /*-----------------------------------------------------------------------------------*/ if (ee_ReadBytes(read_buf, 0, EEPROM_SIZE) == 0)//调用读数据函数 { goto wrong; } printf("读出原始数据:rn"); /*-----------------------------------------------------------------------------------*/ for (i = 0; i < EEPROM_SIZE; i++) { if(read_buf != write_buf)//判断数据是否读取正确 { goto wrong; } if(write_buf == '#') { break; } printf("%c",read_buf); } /*-----------------------------------------------------------------------------------*/ printf("rn抽取后的数据为:rn"); for(i=0;i if(read_buf == 'i'||read_buf == 'I')//判断数据中的ip或IP的位置用以输出IP号 { DataNum++; printf("第%d组数据:",DataNum); for(j=3;j<18;j++) { if(read_buf[i+j] == 'p'||read_buf[i+j] == 'P') { break; } printf("%c",read_buf[i+j]); } } else if(read_buf == 't'||read_buf == 'T')//判断数据中的端口号 { for(j=2;j<8;j++) { if(read_buf[i+j] == '#'||read_buf[i+j] == 'i'||read_buf[i+j] == 'I') { break; } printf("%c",read_buf[i+j]); } printf("rn"); } } printf("rn共%d数据读写完成rn",DataNum); } wrong: printf("出现错误!"); } 问题反馈: 由于代码是根据野火MINI版进行编写,不同开发板的E2PROW的引脚不尽相同,MINI中的开发板SDA与SCL接入的引脚为PA3,PA2 不同的开发板可在 bsp_i2c_gpio.h 文件中修改引脚配置 (查看原理图修改) |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3456 浏览 1 评论
8988 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:25 , Processed in 1.167038 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号