在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示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
在串口调试助手发送选项和接收选项处,还有个“字符格式发送”和“字符格式显示”,这是什么意思呢?
先抛开我们使用的汉字不谈,那么我们常用的字符就包含了0~9的数字、A~Z/a~z的字母、还有各种标点符号等。那么在计算机系统里面我们怎么来表示它们呢?
ASCII码(American Standard Code for Information Interchange,即美国信息互换标准代码)可以完成这个使命:我们知道,在计算机中一个字节的数据可以有0~255共256个值,我们取其中的0~127共128个值赋予了它另外一层涵义,即让它们分别来代表一个常用字符,其具体的对应关系如下表。
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码的十六进制表示,发送框里写入十六进制,实际发送的时候仍然是十六进制转换为二进制,然后按位发送出去。