在.h文件中extern uint8_t recv; 在.c文件中包含.h文件,recv = 10;编译报错
时间: 2024-12-10 08:28:00 浏览: 7
在 C 编程中,`extern` 关键字通常用于声明变量而不是定义它。当你在 `.h` 文件中声明 `extern uint8_t recv;`,表示你在头文件里告诉其他文件存在一个名为 `recv` 的 uint8_t 类型变量,但实际上这个变量的初始化和赋值应在对应的 `.c` 文件中完成。
然而,你直接在 `.c` 文件中赋值 `recv = 10;` 会遇到错误,因为这里的 `recv` 是未初始化的全局变量,而且在包含该 `.h` 文件的其他源文件中,它们并没有看到 `recv` 已经被赋值了。所以,在 `.c` 文件中需要先给 `recv` 赋初始值,然后再使用。
正确的做法是在`.c` 文件中声明并初始化,例如:
```c
uint8_t recv = 10;
// 或者如果你想要让外部也能修改,但在当前文件内保留初始值
extern uint8_t recv;
int main() {
recv = 10; // 现在可以在这里设置值
return 0;
}
```
然后在包含这个 `.c` 文件的其他地方,只需要 `#include "yourfile.c"` 就能看到已经初始化的 `recv` 变量。
相关问题
stm32f103c8t6 485通信的.c.h文件
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它支持RS-485通信,这是一种全双工、两线制的数据传输标准。在开始设计RS-485通信功能时,通常会涉及两个关键文件:`.c`文件用于编写实际的函数实现,`.h`文件则包含了函数声明和相关的结构体。
`.c` 文件(例如 `stm32f103_r485_comm.c`)示例:
```c
#include "stm32f103_r485_comm.h"
void r485_init(void);
void r485_send_data(uint8_t* data, uint16_t length);
void r485_recv_data(uint8_t* buffer, uint16_t size);
// 实现部分...
void r485_init() {
// 初始化RS-485端口设置
}
void r485_send_data(uint8_t* data, uint16_t length) {
// 发送数据的逻辑
}
void r485_recv_data(uint8_t* buffer, uint16_t size) {
// 接收数据的逻辑
}
```
`.h` 文件(例如 `stm32f103_r485_comm.h`)示例:
```c
#ifndef STM32F103_R485_COMM_H
#define STM32F103_R485_COMM_H
#include "stm32f10x.h" // 包含STM32的头文件
extern void r485_init();
extern void r485_send_data(uint8_t*, uint16_t);
extern void r485_recv_data(uint8_t*, uint16_t);
#endif /* STM32F103_R485_COMM_H */
```
在`.h`文件中,我们只声明了函数并引入必要的宏,而在`.c`文件中我们实现了具体的细节。`r485_init()`负责初始化RS-485模块,`r485_send_data()`和`r485_recv_data()`分别处理发送和接收数据的操作。
linux i2c数据传输 写读
在Linux中,你可以使用I2C操作函数来进行数据传输,包括写和读操作。对于写操作,你可以使用i2c_master_send函数,它的原型是extern int i2c_master_send(struct i2c_client *client, const char *buf, int count)。该函数用于向指定的I2C设备写入数据。对于读操作,可以使用i2c_master_recv函数,它的原型是extern int i2c_master_recv(struct i2c_client *client, char *buf, int count)。该函数用于从指定的I2C设备读取数据。
以下是一个示例代码,演示了如何使用I2C操作函数进行写和读操作:
```
static int i2c_write_read(struct i2c_client *client, uint8_t reg, uint8_t *write_data, int write_len, uint8_t *read_data, int read_len) {
int ret;
// 写操作
ret = i2c_master_send(client, ®, 1);
if (ret < 0) {
printk(KERN_ERR "Failed to write register\n"); return ret;
}
// 读操作
ret = i2c_master_recv(client, read_data, read_len);
if (ret < 0) {
printk(KERN_ERR "Failed to read data\n");
return ret;
}
return 0;
}
```
阅读全文