问题列表

  • CH340串口识别失败(22.12.17)
  • Keil5 如何兼容C51和STM32(22.12.17)
  • 如何创建C51工程模板(22.12.17)
  • 如何修改字体大小(22.12.17)
  • 将浮点数或整数转化为字符串方案(23.03.04)
  • Keil的 "0xFD" Bug(23.03.04)
  • 常见警告信息
  • 未调用函数警告(22.12.19)
  • 常见报错信息
  • 变量定义报错(22.12.19)
  • 文件类型导入错误(23.3.13)


CH340串口识别失败(22.12.17)

  1. 用数据线连接好,打开设备管理器,检查端口(COM),是否有“CH340”字样的串口。若无,则说明串口未正确识别。
  2. 检查CH340驱动是否安装。
  3. 更换数据线再次尝试。有的数据线接口看似有5个pin(如Micro USB),但实际只有两根充电线,没有数据传输功能,没有差分信号,自然无法识别串口。
  4. 换一个电脑的USB接口进行尝试,有可能是接口质量问题。
  5. 检查USB转TTL电路是否有虚焊,损坏。(一般不会)

Keil5 如何兼容C51和STM32(22.12.17)

  • 进入官网,对于51单片机和STM32单片机有两个版本。
  • Keil uvision5(MDK-ARM) : Development environment for Cortex and Arm devices. 为Cortex内核ARM内核设计。
  • Keil uvision5(C51) : Development tools for all 8051 devices. 为51内核设计。
  • 将两个版本都下载至同一个目录下即可同时使用。

如何创建C51工程模板(22.12.17)

  • Keil4:找Atmel公司的AT89C52芯片即可。
  • Keil5:找Microchip中的AT89C51/AT89C52即可。

如何修改字体大小(22.12.17)

  • 打开Keil,点击最右侧扳手图标,点击Font选项卡,选中C/C++,修改对应字号。
  • 若出现"access to xxxx global.prop was denied"的字样,关闭Keil,以管理员身份运行Keil重复上述操作即可。

将浮点数或整数转化为字符串方案(23.03.04)

使用 sprintf 字符串格式化函数,格式为

#include <stdio.h>  //需包含头文件

char strA[10]; //保证一定长度,用于保存字符串
char strB[10]; 
sprintf(strA, "%d", 123); //整数转换字符串
sprintf(strB, "%0.6f, 3.141593"); //浮点数转换字符串

需要注意:在整数转换时,"%d"指 int 类型,占两字节,故传递整数时也应传递 int 类型。如果误输入常用的 unsigned char 类型(仅占1个字节),会导致转换结果异常。

Keil的 “0xFD” Bug(23.03.04)

在一次偶然的串口通讯过程中,汉字 “数” 始终无法正确显示,经验证是 Keil 的历史遗留 Bug

汉字机内码0xFD 结尾的部分汉字会被截尾(如等),甚至影响到后面汉字的正常显示。应尽量避免使用上述汉字。

常见警告信息

未调用函数警告(22.12.19)

```c
*** WARNING Lxx(行号): UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS     SEGMENT: ?PR?xxxx(函数名)?MAIN
```
**如果你定义了一个函数,但并没有调用它,就会产生这个警告**。这在标准C编程中一般不会警告。我猜测是单片机的RAM资源相对紧缺,通过该警告可以提示编码人员精简无用代码。

常见报错信息

变量定义报错(22.12.19)

```c
main.c(xx): error C141: syntax error near 'int', expected 'sizeof'
```
  • 首先检查有没有犯弱智错误:括号,分号是否漏打。
  • 如果语法没有问题,那么一般是编译器的差异导致的。Keil编译器遵循的是比较古老的C标准在函数定义的内部,必须把所有的局部静态变量和自动变量都声明了之后,然后才能开始后续的代码书写,否则编译器会报错。
  • 举个栗子,在标准C中,我们可以变量定义写在for循环里。
for(int i = 0; i < 10; i++){
	// 正常运行
}

然而在Keil中,这么写就会报上述错误,导致变量未正确定义,后续只要使用到该变量就会报 undefined identifier 的错误(可能会产生一大堆)。

所以应该更正为

int i; //先定义变量
for(i = 0; i < 10; i++){
	//正常运行
}

文件类型导入错误(23.3.13)

```c
FCARM - Output Name not specified, please check ‘Options for Target - Utilities
```
用户的`.c`和`.h`文件被导入 **keil** 时有可能会被识别成 **image file** 文件(==图标与正常C文件不同==)。选择对应文件右击选择`Options for File`,在`File Type`选择正确的文件类型。