在使用串口助手调试,TCP/UDP测试等工具时,经常会在主界面上的数据发送区和数据接收区有一个“按十六进制”的选项,在数据发送区,如果不选择此项,在输入框中输入要发送的字母或者数字,点击“发送”时,这时将按字符的方式发送,即输入的每一个数字或者字母将转换成ASCii码发送,如1a,实际发送的是1的ACSII值49,a的ACSII值97,发送的是两个字符的ASCII值,如果选择了此项,那么点击“发送”按钮时将直接发送1a而非每一个字符的ASCII值,即1a;在数据接收区,该功能类似。
注意:由于char类型的取值范围为-128-+127,所以在接收十六进制发送的数据时为防止溢出,接收数据类型最好定义为unsigned char,其取值范围为0-255。
用串口发送数据的时候首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照二进制的方式一位一位的发送出去。
例如我们要发送一串数据“A852010100000000A91A”,以字符串和十六进制两种方式发送:
(1)字符串发送
串口以字符串发送数据,首先将字符串转化为二进制,格式如下:
0100 0001 0011 1000 0011 0101 0011 0010 0011 0000 00110001 0011 0000 0011 0001
A(0x41) 8 5 2 0 1 0 1
0011 0000 0011 0000 0011 0000 0011 0000 0100 0001 0011 1001 0011 0001 0100 0001
0 0 0 0 A 9 1 A
然后按照8位(串口设置数据位为8位)形式将数据发送出去。
串口接收的数据格式如下:
编号 | 数据内容 | 编号 | 数据内容 |
0 | A | 8 | 0 |
1 | 8 | 9 | 0 |
2 | 5 | 10 | 0 |
3 | 2 | 11 | 0 |
4 | 0 | 12 | A |
5 | 1 | 13 | 9 |
6 | 0 | 14 | 1 |
7 | 1 | 15 | A |
(2)十六进制发送数据
串口以十六进制发送数据,首先将数据转化为:
1010 1000 0110 0010 0000 0001 0000 0001 0000 0000 0000 0000 1010 1001 0001 1010
0XA8 0X52 0X01 0X01 0X00 0X00 0XA9 0X1A
然后按照8位(串口设置数据位为8位)形式将数据发送出去。
串口接收的数据格式如下:
编号 | 数据内容 | 编号 | 数据内容 |
0 | A8 | 4 | 00 |
1 | 52 | 5 | 00 |
2 | 01 | 6 | A9 |
3 | 01 | 7 | 1A
|
(3)数据转换
任何数据在计算机内部都是以二进制保存的,所以
进制与数据的存储无关,只与输入输出有关。所以,对于进制转换,我们只关心字符串中的结果。
比如我想发送一个
十六进制的字符数组,但是char 型和int 型的数据不必要转为0X类型,
char型数据类型可同时存储字符或十进制数值,所以可统一用char[]存储,
然后即可发送。
点击(此处)折叠或打开
1. /* UTC time */
2.
3. //不必要将int型变量转为整型十六进制表示,可直接与0xff求与,只关心结果,转换过程在计算机内部处理
4.
5. time_t tm;
6. unsigned char buffer[10];
7. tm = time(NULL);
8.
9. printf("%d:%x\n",(int)tm,(unsigned int)tm);
10.
11. buffer[0] = ( tm & 0xFF );
12.
13. buffer[1] = ( tm & 0xFF00 ) >> 8;
14.
15. buffer[2] = ( tm & 0xFF0000 ) >> 16;
16.
17. buffer[3] = ( tm & 0xFF000000 ) >> 24;
点击(此处)折叠或打开
1.
2. //虽然buf定义了几个十六进制元素,但填充后面的元素并不需要转换为十六进制来表示,直接赋值即可
3. unsigned char buf[20] = {0xAB,0x3C,0x02};
4. char *str = "asd2bc";
5. buf[3] = str[0]; // a
6. buf[4] = str[1]; // s
7. buf[5] = str[2]; // d
8. buf[6] = str[3]; // 2
9. buf[7] = str[4]; // b
10. buf[8] = str[5]; // c
11.
12. send(fd,buf,ntypes); //TCP发送数据