ASCII碼
在計算機中,所有的數據在存儲和運算時都要使用二進制數表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規則,於是美國有關的標准化組織就出台了所謂的ASCII編碼,統一規定了上述常用符號用哪些二進制數來表示.
A在ascii中定義為01000001,也就是十進制65,有了這個標准后,當我們輸入A時,計算機就可以通過ascii碼知道輸入的字符的二進制編碼是01000001。而沒有這樣的標准,我們就必須自己想辦法告訴計算機我們輸入了一個A;沒有這樣的標准,我們在別的機器上就需要重新編碼以告訴計算機我們要輸入A。ascii碼指的不是十進制,是二進制。只是用十進制表示習慣一點罷了,比如在ascii碼中,A的二進制編碼為01000001,如果用十進制表示是65,用十六進制表示就是41H
下面摘錄自http://www.51hei.com/bbs/dpj-22296-1.html
在串口調試助手發送選項和接收選項處,還有個“字符格式發送”和“字符格式顯示”,這是什么意思呢?
先拋開我們使用的漢字不談,那么我們常用的字符就包含了
0~9
的數字、
A~Z/a~z
的字母、還有各種標點符號等。那么在計算機系統里面我們怎么來表示它們呢?
ASCII
碼(American Standard Code for Information Interchange
,即美國信息互換標准代碼)可以完成這個使命:我們知道,在
計算機中一個字節的數據可以有0~255共256個值,我們取其中的0~127共128個值賦予了它另外一層涵義,即讓它們分別來代表一個常用字符,其具體的對應關系如下表。
表
11-3 ASCII
表
ASCII值
|
控制字符
|
ASCII值
|
字符
|
ASCII值
|
字符
|
ASCII值
|
字符
|
000
|
NUL
|
032
|
(space)
|
064
|
@
|
096
|
’
|
001
|
SOH
|
033
|
!
|
065
|
A
|
097
|
a
|
002
|
STX
|
034
|
"
|
066
|
B
|
098
|
b
|
003
|
ETX
|
035
|
#
|
067
|
C
|
099
|
c
|
004
|
EOT
|
036
|
$
|
068
|
D
|
100
|
d
|
005
|
END
|
037
|
%
|
069
|
E
|
101
|
e
|
006
|
ACK
|
038
|
&
|
070
|
F
|
102
|
f
|
007
|
BEL
|
039
|
'
|
071
|
G
|
103
|
g
|
008
|
BS
|
040
|
(
|
072
|
H
|
104
|
h
|
009
|
HT
|
041
|
)
|
073
|
I
|
105
|
i
|
010
|
LF
|
042
|
*
|
074
|
J
|
106
|
j
|
011
|
VT
|
043
|
+
|
075
|
K
|
107
|
k
|
012
|
FF
|
044
|
,
|
076
|
L
|
108
|
l
|
013
|
CR
|
045
|
-
|
077
|
M
|
109
|
m
|
014
|
SO
|
046
|
.
|
078
|
N
|
110
|
n
|
015
|
SI
|
047
|
/
|
079
|
O
|
111
|
o
|
016
|
DLE
|
048
|
0
|
080
|
P
|
112
|
p
|
017
|
DC1
|
049
|
1
|
081
|
Q
|
113
|
q
|
018
|
DC2
|
050
|
2
|
082
|
R
|
114
|
r
|
019
|
DC3
|
051
|
3
|
083
|
S
|
115
|
s
|
020
|
DC4
|
052
|
4
|
084
|
T
|
116
|
t
|
021
|
NAK
|
053
|
5
|
085
|
U
|
117
|
u
|
022
|
SYN
|
054
|
6
|
086
|
V
|
118
|
v
|
023
|
ETB
|
055
|
7
|
087
|
W
|
119
|
w
|
024
|
CAN
|
056
|
8
|
088
|
X
|
120
|
x
|
025
|
EM
|
057
|
9
|
089
|
Y
|
121
|
y
|
026
|
SUB
|
058
|
:
|
090
|
Z
|
122
|
z
|
027
|
ESC
|
059
|
;
|
091
|
[
|
123
|
{
|
028
|
FS
|
060
|
<
|
092
|
\
|
124
|
|
|
029
|
GS
|
061
|
=
|
093
|
125
|
}
|
|
030
|
RS
|
062
|
>
|
094
|
^
|
126
|
~
|
031
|
US
|
063
|
?
|
095
|
_
|
127
|
DEL
|
這樣我們就在常用字符和字節數據之間建立了一一對應的關系,字節是數據存儲的最小單位,存儲一個字符是以字節為單位進行的(也即是8位二進制),那么現在一個字節就既可以代表一個整數又可以代表一個字符了,但它本質上只是一個字節的數據,而我們賦予了它不同的涵義,什么時候賦予它哪種涵義就看編程者的意圖了。
通過上述可以知道串口通信的本質是發送對應字符的以二進制表示的ASCII碼:
比如:
用字符格式發送一個小寫的
a,a的ASCII碼是二進制 0110 0001 ,十六進制的0x61,十進制是97,就是通過串口把0110 0001按位發送出去;
用字符格式發送一個數字1, 1的ASCII碼是二進制 0011 0001 ,十六進制的0x31,十進制是49,就是通過串口把0011 0001按位發送出去;
用字符格式發送 a12b, a12b的ASCII碼是二進制 0110 0001 0011 0001 0011 0010 0110 0010,十六進制 61 31 32 62 ,就是通過串口按位發送出去,而每發送八位數據(一個字節)就有一個停止位,然后發送接下來的一個字符(8位),這樣就依次發送了字符a-1-2-b 的ASCII碼。
用十六進制發送的本質就是發送對應字符的ASCII碼的十六進制表示,發送框里寫入十六進制,實際發送的時候仍然是十六進制轉換為二進制,然后按位發送出去。