举例说明串口发送数据——字符串发送与十六进制发送的区别

            在使用串口发送数据时可以选择字符串发送或者十六进制发送,通常情况下我们习惯选用字符串发送数据。关于两者的区别,需要从计算机存储数据的格式说起。

        在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在计算机中用 0000 0001(2)来表示。我们在用串口发送数据的时候首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照二进制的方式一位一位的发送出去。

例如我们要发送一串数据“A852010100000000A91A”,以字符串和十六进制两种方式发送:

(1)字符串发送

         串口以字符串发送数据,首先将字符串转化为二进制,格式如下:

          0000 1010     0000 1000    0000 0110    0000 0010    0000 0000   0000 0001   0000 0000    0000 0001 

                A                   8                  5                      2                    0                1                    0                    1

 

          0000 0000     0000 0000   0000 0000    0000 0000     0000 1010    0000 1001    0000 0001    0000 1010

                          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

 

          仔细对照接收结果就很容易明白字符串发送和十六进制发送的区别了。下面用Arduino语言举例说明

文件sendtype.ino:

#include <Wire.h>
uint8_t buffer[] = "A852010100000000A91A";
char val,i;
void setup() {
  Serial.begin(9600);
  Wire.begin();
}
void loop(){
  val=Serial.read();   
  if(val=='c')   
     {     
     for(i=0;i<20;i++)
     Serial.print(buffer[i]);
     //Serial.println("");   
     }
   else if(val=='b')
     {   
    Serial.write(buffer,20);
     //Serial.println("");   
     } 
}
我用Arduino板MEGA 2560测试,结果如下

手动发送b,以十六进制形式发送Serial.write(buffer,20);下图是HEX显示

                                      

                                    

手动发送c.以字符形式发送Serial.print(buffer[i]);右图是HEX显示

                                       

                                      

通过上面的例子进一步说明,以什么形式发送数据完全取决于发送函数的处理,最终串口发出的都是一串二进制码。串口实验一定要注意波特率一致,特别是接蓝牙模块时,一般蓝牙模块出厂波特率都是9600,其它波特率需要发AT指令修改。

注:文章部分转载自http://blog.csdn.net/wityy/article/details/8234739

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Adriano 可以通过使用蓝牙模块来发送十六进制数据。蓝牙是一种无线通信技术,可用于在设备之间传输数据。 要在 Adriano 上发送十六进制数据,首先需要安装和配置蓝牙模块。我们可以选择一款兼容 Arduino 的蓝牙模块,例如 HC-05 或 HC-06。 接下来,我们需要编写 Arduino 代码来实现发送十六进制数据。使用 Serial.write() 函数,我们可以将十六进制数据作为字节发送。 以下是一个示例代码片段,说明了如何使用 Adriano 发送十六进制数据: ```cpp #include <SoftwareSerial.h> SoftwareSerial btSerial(10, 11); // 使用软串口与蓝牙模块通信 unsigned char data[] = {0x12, 0x34, 0xAB, 0xCD}; // 十六进制数据 void setup() { // 初始化串口和蓝牙模块 Serial.begin(9600); btSerial.begin(9600); } void loop() { // 发送十六进制数据 for (int i = 0; i < sizeof(data); i++) { btSerial.write(data[i]); Serial.print("Sent: 0x"); Serial.println(data[i], HEX); delay(1000); } } ``` 在这个示例中,我们使用 SoftwareSerial 库来模拟一个串口来与蓝牙模块进行通信。我们首先初始化串口和蓝牙模块通信的波特率,并在主循环中使用 btSerial.write() 函数逐个字节地发送十六进制数据。同时,我们使用 Serial.print() 函数将发送数据打印到串口监视器中,以便进行调试。 通过使用类似的代码,Adriano 就可以通过蓝牙模块来发送十六进制数据了。根据你实际的需求,可能需要对代码进行进一步的调整和优化。希望这个回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值