- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 uint8_t 和 uint16_t 成员的结构从 ATMega32 微 Controller 保存到外部 EEPROM 中。因此,我编写了一个函数来保存该结构,并编写了另一个函数来再次读取它。在读取函数中,地址作为指针传入。在函数内部,该值通过 RS232 打印,但我得到了错误的数据和错误的地址(下面的终端输出)。但我不改变地址(如你所见),我不知道为什么输出是“600”。保存单个字节的函数工作正常,我已经单独测试了它们。
这是我尝试准备结构、保存并最后再次读取的主程序。主程序下
uint16_t testSaveAddr = 20;
uint16_t testLoadAddr = 20;
dataEntry testData;
dataEntry loadData;
testData.airPressure = 1023;
testData.batteryCharge = 140;
testData.dayOfMonth = 20;
testData.hours24 = 11;
testData.humidityInside = 63;
testData.humidityOutside = 80;
testData.lightVal = 123;
testData.minutes = 30;
testData.month = 11;
testData.rain = 0;
testData.temperatureInside = 240;
testData.temperatureOutside = 130;
testData.windDirection = 4;
testData.windVelocity = 300;
testData.yearS70 = 35;
saveDataSet(EEPROM_1_ADDR,testData,&testSaveAddr);
_delay_ms(200);
readDataSet(EEPROM_1_ADDR,&testLoadAddr,&loadData);
_delay_ms(200);
uint8_t saveDataSet (char address_device, dataEntry dS, uint16_t *firstAvailableAddr)
{
uart_puts("*** SAVING NOW ****\n");
//hum -> timeStamp, LOW -> HIGH
uint16_t addr = *firstAvailableAddr;
char text[20];
sprintf(text,"1.| addr: %d\t data: %d\n",addr,dS.humidityOutside);
uart_puts(text);
save_byte_to_eeprom(address_device, addr++, dS.humidityOutside);
sprintf(text,"1.| addr: %d\t data: %d\n",addr,dS.humidityInside);
uart_puts(text);
save_byte_to_eeprom(address_device, addr++, dS.humidityInside);
save_byte_to_eeprom(address_device, addr++, (dS.temperatureOutside)&0xFF);
save_byte_to_eeprom(address_device, addr++, ((dS.temperatureOutside)>>8)&0xFF);
save_byte_to_eeprom(address_device, addr++, (dS.temperatureInside)&0x0FF);
save_byte_to_eeprom(address_device, addr++, ((dS.temperatureInside)>>8)&0xFF);
save_byte_to_eeprom(address_device, addr++, (dS.airPressure)&0xFF);
save_byte_to_eeprom(address_device, addr++, ((dS.airPressure)>>8)&0xFF);
save_byte_to_eeprom(address_device, addr++, (dS.windVelocity)&0xFF);
save_byte_to_eeprom(address_device, addr++, ((dS.windVelocity)>>8)&0xFF);
save_byte_to_eeprom(address_device, addr++, dS.windDirection);
save_byte_to_eeprom(address_device, addr++, dS.lightVal);
save_byte_to_eeprom(address_device, addr++, dS.rain);
save_byte_to_eeprom(address_device, addr++, dS.batteryCharge);
//timeStamp
save_byte_to_eeprom(address_device, addr++, dS.minutes);
save_byte_to_eeprom(address_device, addr++, dS.hours24);
save_byte_to_eeprom(address_device, addr++, dS.dayOfMonth);
save_byte_to_eeprom(address_device, addr++, dS.month);
save_byte_to_eeprom(address_device, addr++, dS.yearS70);
//update, when dataset is fully stored, in case of an error
*firstAvailableAddr = addr;
return 1;
}
uint8_t readDataSet (char address_device, uint16_t *nextDSaddr, dataEntry dS)
{
uint16_t addr = *nextDSaddr;
char text[20];
uart_puts("**** READING NOW ****");
dS->humidityOutside = read_byte_from_eeprom(address_device,addr);
sprintf(text,"1.| addr: %d\t data: %d\n",addr,dS->humidityOutside);
uart_puts(text);
addr++;
dS->humidityInside = read_byte_from_eeprom(address_device,addr++);
uint8_t tempOutLow = read_byte_from_eeprom(address_device,addr++);
uint8_t tempOutHigh = read_byte_from_eeprom(address_device,addr++);
dS->temperatureOutside = (tempOutHigh<<8)+tempOutLow;
uint8_t tempInLow = read_byte_from_eeprom(address_device,addr++);
uint8_t tempInHigh = read_byte_from_eeprom(address_device,addr++);
dS->temperatureInside = (tempInHigh<<8)+tempInLow;
uint8_t airPressLow = read_byte_from_eeprom(address_device,addr++);
uint8_t airPressHigh = read_byte_from_eeprom(address_device,addr++);
dS->airPressure = (airPressHigh<<8)+airPressLow;
uint8_t windVelLow = read_byte_from_eeprom(address_device,addr++);
uint8_t windVelHigh = read_byte_from_eeprom(address_device,addr++);
dS->airPressure = (windVelHigh<<8)+windVelLow;
dS->windDirection = read_byte_from_eeprom(address_device,addr++);
dS->lightVal = read_byte_from_eeprom(address_device,addr++);
dS->rain = read_byte_from_eeprom(address_device,addr++);
dS->batteryCharge = read_byte_from_eeprom(address_device,addr++);
//timestamp
dS->minutes = read_byte_from_eeprom(address_device,addr++);
dS->hours24 = read_byte_from_eeprom(address_device,addr++);
dS->dayOfMonth = read_byte_from_eeprom(address_device,addr++);
dS->month = read_byte_from_eeprom(address_device,addr++);
dS->yearS70 = read_byte_from_eeprom(address_device,addr++);
*nextDSaddr = addr;
return 1;
}
终端输出:
*** SAVING NOW ****
1.| addr: 20 data: 80
1.| addr: 21 data: 63
**** READING NOW ******
1.| addr: 600 data: 255
最佳答案
我认为,当您在 saveDataSet
中生成字符串时,您可能会通过溢出 text
缓冲区来覆盖 testLoadAddr
变量的内容。您只允许使用 20 个字符,但您有 2 位数字,因此有一串 24 个字符,包括终止 NUL。这肯定是一个问题,尽管具体哪些变量受到影响将取决于编译器创建的堆栈布局。
关于c - 在 AVR 微 Controller 上使用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33607578/
前言 众所周知,对于 16 位 I/O 寄存器(定时器计数器、ICR/OCR、ADC...)的原子和同时读/写高和低部分,AVR 使用影子临时寄存器。例如。在 ATmega8 上读取 TCNT1: u
我想使用 avr-gcc 将全局变量绑定(bind)到未使用的 I/O 寄存器(例如 PORTB),以减少代码大小。我在AVR的应用笔记AVR035中学到了这个技巧(第 14 页)。 在应用笔记中,他
我有一个项目,其中 ATtiny2313V 控制 7x5 LED 矩阵以显示滚动文本。为了显示文本,我构建了一个字体,它与程序的其余部分一起存储在闪存中。 整个程序,包括整个字体,占用 1106 字节
我尝试使用 this Code/Guide在 ATmega1284p 上。 我遇到的问题是链接器不工作,执行后出现以下错误消息(代码为 ATmega88 构建良好): avr-ld -o main.
我原以为 8 位 AVR 平台不需要任何对齐。但是,我在 an LLVM commit 中发现了以下评论: The previous data layout caused issues when de
我想生成一个具有可变频率和固定占空比 (50%) 的 PWM 信号。频率应在 0-25KHz 之间变化。这是用于 ATMEGA32U4 微 Controller 的,我正在使用 Atmel Studi
我想生成一个具有可变频率和固定占空比 (50%) 的 PWM 信号。频率应在 0-25KHz 之间变化。这是用于 ATMEGA32U4 微 Controller 的,我正在使用 Atmel Studi
当我尝试使用 AVR studio 4 调试一小段代码时,出现此错误: Build failed... No build tools defined. 有人能给我一些建议吗? 最佳答案 在 AVRSt
我有一个设置为 CodeVision AVR 项目的遗留代码。我想迁移到 AVR Studio 甚至更好的 NetBeans(使用 AVR 工具链或 WinAVR)。 有什么想法吗? 最佳答案 你应该
我在以 AVR 为目标的 C 中遇到毫秒延迟循环的问题。我在从 Ubuntu 存储库获得的 Linux 上使用 avr-gcc 4.7.0,我也有尝试了新编译的 4.7.2。目标硬件是 XMEGA12
如何启用或禁用 IDE 的自动完成功能 AVR-Studio 5或 AVR-Studio 4 ?我是否必须编辑一些安装文件才能做到这一点? 视频中AVR Studio 5: How to use th
我正在尝试用 Arduino Eclipse 插件替换 Arduino IDE。下载所需的一切并尝试编译最简单的“Hello World”程序后,我在 eclipse 中遇到以下错误: 调用时: wh
我继承了一个链接到一个库的应用程序,该库可能是用 gcc3 构建的。或者也许使用 imagecraft 编译器。这些信息现在已经消失在天堂般的位域中,我只剩下一个 libXXX.a 库来链接我的应用程
我正在尝试通过 USBASP 编程器将一些数据从 PC 发送到 ATmega328P 芯片。 它能够通过 SPI 传输最多 4 个字节。这 4 个字节可以在 USB Setup Packet 中设置(
我正在使用 ATMEGA128 与另一台设备进行通信。为此,我使用带有 ATMEGA128 的 SPI 作为从机。我使用 SS、SCK 和 MOSI 引脚。我面临的问题是,当我必须下载程序时,我必须断
我有以下汇编代码: __asm__ __volatile__ ( "1: subi %0, 1" "\n\t" "brne 1b" : "=d" (__count)
大家好! 我的 DIY 洒水器和鱼缸自动化的 AVR 取得了很好的进展,但我遇到了一个问题,这让我很烦恼。 哪个 if 语句在 AVR 上运行得更快?(在更少的时钟周期内)多少? if(temp_se
我见过的所有示例 AVR 程序都以如下代码开头: .org $0000 rjmp Reset ; ... Reset: ; Start of program 如果我不使用任何中
我正在使用avr-gcc 4.8.2对Atmel ATtiny13a微 Controller 进行编程。 这是我的C代码: #include #include int main(void) {
所以,我使用的是 ATMega168与 NerdKits使用两个中断 INT0 和 INT1 设置并连接一个 LCD。我想附上 Grove Heart Rate Monitor ,我已附加到 PCIN
我是一名优秀的程序员,十分优秀!