【串口通信】字符串发送与十六进制发送的区别

您所在的位置:网站首页 十六进制的算法是什么样的 【串口通信】字符串发送与十六进制发送的区别

【串口通信】字符串发送与十六进制发送的区别

2024-06-16 01:38| 来源: 网络整理| 查看: 265

    注意:由于char类型的取值范围为-128-+127,所以在接收十六进制发送的数据时为防止溢出,接收数据类型最好定义为unsigned char,其取值范围为0-255。

    在计算机中,数据是以二进制的形式存储的,例如十进制 1(10进制)在计算机中用 0000 0001(2进制)来表示。我们在用串口发送数据的时候首先将待数据转换为对应的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[]存储,             然后即可发送。 /* UTC time */ //不必要将int型变量转为整型十六进制表示,可直接与0xff求与,只关心结果,转换过程在计算机内部处理 time_t tm; unsigned char buffer[10]; tm = time(NULL); printf("%d:%x\n",(int)tm,(unsigned int)tm); buffer[0] = ( tm & 0xFF ); buffer[1] = ( tm & 0xFF00 ) >> 8; buffer[2] = ( tm & 0xFF0000 ) >> 16; buffer[3] = ( tm & 0xFF000000 ) >> 24; //虽然buf定义了几个十六进制元素,但填充后面的元素并不需要转换为十六进制来表示,直接赋值即可 unsigned char buf[20] = {0xAB,0x3C,0x02}; char *str = "asd2bc"; buf[3] = str[0]; // a buf[4] = str[1]; // s buf[5] = str[2]; // d buf[6] = str[3]; // 2 buf[7] = str[4]; // b buf[8] = str[5]; // c send(fd,buf,ntypes); //TCP发送数据


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3