128个字符的ASCII码表

  这里复习、细讲ASCII码表,为后面的知识做铺垫。

一、128个字符的ASCII码表

  重新认识一下128字符的ASCII码表。基础ascii码值最大值是0x7f=127,扩展ascii码值最大值是0xFF=255。

Dec Hex 缩写/字符 解释
0 00 NUL(null) 空字符
1 01 SOH(start of headline) 标题开始
2 02 STX (start of text) 正文开始
3 03 ETX (end of text) 正文结束
4 04 EOT (end of transmission) 传输结束
5 05 ENQ (enquiry) 请求
6 06 ACK (acknowledge) 收到通知
7 07 BEL (bell) 响铃
8 08 BS (backspace) 退格
9 09 HT (horizontal tab) 水平制表符
10 0A LF (NL line feed, new line) 换行键
11 0B VT (vertical tab) 垂直制表符
12 0C FF (NP form feed, new page) 换页键
13 0D CR (carriage return) 回车键
14 0E SO (shift out) 不用切换
15 0F SI (shift in) 启用切换
16 10 DLE (data link escape) 数据链路转义
17 11 DC1 (device control 1) 设备控制1
18 12 DC2 (device control 2) 设备控制2
19 13 DC3 (device control 3) 设备控制3
20 14 DC4 (device control 4) 设备控制4
21 15 NAK (negative acknowledge) 拒绝接收
22 16 SYN (synchronous idle) 同步空闲
23 17 ETB (end of trans. block) 传输块结束
24 18 CAN (cancel) 取消
25 19 EM (end of medium) 介质中断
26 1A SUB (substitute) 替补
27 1B ESC (escape) 换码(溢出)
28 1C FS (file separator) 文件分割符
29 1D GS (group separator) 分组符
30 1E RS (record separator) 记录分离符
31 1F US (unit separator) 单元分隔符
32 20 (space) 空格
33 21 !
34 22
35 23 #
36 24 $
37 25 %
38 26 &
39 27
40 28 (
41 29 )
42 2A *
43 2B +
44 2C ,
45 2D -
46 2E .
47 2F /
48 30 0
49 31 1
50 32 2
51 33 3
52 34 4
53 35 5
54 36 6
55 37 7
56 38 8
57 39 9
58 3A :
59 3B ;
60 3C <
61 3D =
62 3E >
63 3F ?
64 40 @
65 41 A
66 42 B
67 43 C
68 44 D
69 45 E
70 46 F
71 47 G
72 48 H
73 49 I
74 4A J
75 4B K
76 4C L
77 4D M
78 4E N
79 4F O
80 50 P
81 51 Q
82 52 R
83 53 S
84 54 T
85 55 U
86 56 V
87 57 W
88 58 X
89 59 Y
90 5A Z
91 5B [
92 5C \
93 5D ]
94 5E ^
95 5F _
96 60 `
97 61 a
98 62 b
99 63 c
100 64 d
101 65 e
102 66 f
103 67 g
104 68 h
105 69 i
106 6A j
107 6B k
108 6C l
109 6D m
110 6E n
111 6F o
112 70 p
113 71 q
114 72 r
115 73 s
116 74 t
117 75 u
118 76 v
119 77 w
120 78 x
121 79 y
122 7A z
123 7B {
124 7C |
125 7D }
126 7E ~
127 7F DEL (delete) 删除

二、ASCII码表带来的现象

2.1 Modbus协议模式选择

  在Modbus通讯协议中,分为RTU & ASCII 模式。在底层的串口配置中,RTU模式只能配置 8-e-1,8-o-1,8-n-1的8位数据位;而ASCII模式不仅可以配置以上的模式,还可以配置7-e-1,7-o-1,7-n-1。

这里的原因,就是因为ASCII基本码就是128个,完全(刚好)能用7个bit来表示。而RTU发送十六进制的数据,则需要8个bit(0xff),被去掉了一位,因为是不支持7位的数据位发送。

  这里又暗示了串口的一个理解上的误区。串口发送的最小单位数据帧的最小单位。假如串口模式是7位的数据位,你发的是数据基本单位是0xff(8bit);例如你发 0xff 0x12 0x34 ,此时串口会截取掉高位,只发每个数据单元的7bit。不会说这先发这个数据的7bit,多出来的 1bit 下次再填进去补给你(下次一定)。

2.2 中文字符乱码

  从上面延伸出来的串口发送知识误区,得到一种 中文字符乱码 的现象。假如一个产品,有中英文,可以通过串口打印出数据;你会发现一旦串口配置为7位数据位,英文版本打印正常,而中文版本打印异常。

这就是因为汉字是双字的,拆分出来两个8bit(0xff),假如串口使用7位的数据位,就会截取掉高位;而英文是ASCII,只需要7bit,因此英文显示正常。

2.3 对字符的解析

  常见于几种情况,举例如下:

  1. 制作裸机不带enwin的嵌入式led驱动
  2. 与GSM模块等通讯
  3. 通讯协议的数据包的识别区分(例如X-modem协议)

  led驱动的字符显示驱动,把要显示的字符串,截取成逐个的字符,做显示;显示会做判断两种情况,:

  • *s < 128 , 显示ASCII码库的字符
  • *s > 128 , 显示自己写的(汉字)库的字符(汉字双字节 0xffff 明显超过 0x7f)

  与GSM模块进行通讯配置的时候,而且这种通讯是字符的。

1
2
3
4
5
if((uint32_t)cmd<=0XFF)
{
while((USART3->SR&0X40)==0);//等待上一次数据发送完成
USART3->DR=(u32)cmd;
}else u3_printf("%s\r\n",cmd);//发送命令

如果是有写过类似GSM模块通讯的,应该都看过类似上面语句。主控发给模块的指令,先分解逐个字符;再根据是否小于0xff,是直接发还是用字符串打印函数。

  如果是小于0xff,当然是可以用串口8位的数据位进行发送;但是什么时候才会大于0xff,就是该 cmd 非ASCII的时候(而是字符串),例如汉字。


  X-modem协议的数据包的识别区分。当利用Xmodem协议进行传输文本文件,因为数据包的结束符 CTRL-Z(0x1A) 不是前128个ascii码中的通用可见字母字符( 0x1A 对应 SUB[替补],非文本文件的字符 )。

-------------本文结束感谢您的阅读-------------