用stm32cubemx生成了一个串口中断程序,功能实现了对不定长输入字符的统计和输出打印,在主函数写了回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
想重新排版,把回调函数放到UART.c里面,
考虑到main.c和uart.c有公用的变量。在uart.h定义了extern变量
/* USER CODE BEGIN Private defines */
extern uint8_t rx_flag; //输入结束的标志位
extern uint8_t uart_rxbuf[100]; //输入数据的缓存区
extern uint8_t uart_rx[1];//输入字符
extern uint16_t len;
/* USER CODE END Private
编译报错。
L6200E: Symbol rx_flag multiply defined (by usart.o and main.o).
很奇怪,因为目前变量只在uart.h中定义。
后面看了下正点原子的例程,是把extern变量放到uart.h的最下方,
然后我照着把这几个变量挪到相同的位置,编译后,还是报错。
uart-itzhongduan\uart-itzhongduan.axf: Error: L6200E: Symbol HAL_UART_RxCpltCallback multiply defined (by usart.o and main.o).
然后去查看,发现main.c也有中断回调函数,删掉。在编译一次。
还是不行。
最笨的方法没在main.c 也复制一份。
uint8_t rx_flag=0; //输入结束的标志位
uint8_t uart_rxbuf[100]; //输入数据的缓存区
uint8_t uart_rx[1];//输入字符
uint16_t len;
uint16_t uart_state;
再来编译一次。
"uart-itzhongduan\uart-itzhongduan.axf" - 0 Error(s), 0 Warning(s).
补充:
又过了一个月时间。现在有了新的认识。
和大家分享讨论。
对于extern,外部声明的使用。
在某个.c文件中定义一个变量,然后其他.c想使用这个变量。
在.c 或.h中通过添加extern ,都可以正常使用。