文本框输入十六进制,按字节通过蓝牙发送

« 返回首页

有用户问:我想把文本框里输入的「ABCD」,以十六进制 0xAB 0xCD 这样的两个字节通过蓝牙发送出去,有什么转换方案吗? 目前蓝牙发送出去的都是 A、B、C、D 四个字母的 ASCII 码。

能实现,不需要拓展。 用到两样现成的东西:

为什么现在发出去的是四个字节?「发送文本」发的是文字本身,每个字母按 ASCII 编码占一个字节: A 是 41、B 是 42、C 是 43、D 是 44。而你要的是把每两个字符当成一个字节的十六进制写法来解读, 这一步就是「十六进制转字节」做的事。

准备

  1. 拖一个蓝牙客户端、一个二进制组件(在「通信连接」分类里)、一个列表选择器(显示文本「连接蓝牙」);
  2. 再拖一个文本输入框、一个按钮(按钮_发送)和一个标签。

用列表选择器选配对过的设备并连接(经典蓝牙模块如 HC-05 要先在手机系统设置里配对):

when 列表选择器1.BeforePicking() {
  列表选择器1.Elements = 蓝牙客户端1.AddressesAndNames
}

when 列表选择器1.AfterPicking() {
  if (蓝牙客户端1.Connect(列表选择器1.Selection)) {
    标签1.Text = "已连接"
  }
}

实验一:先看清两种发法的区别

不连设备也能做。点按钮,把同一段输入分别「按文本」和「按十六进制」转成字节显示出来:

when 按钮_发送.Click() {
  var 按文本 = 二进制1.FromText(文本输入框1.Text)
  var 按十六进制 = 二进制1.FromHex(文本输入框1.Text)
  标签1.Text = join("按文本:", 二进制1.ToHex(按文本), "  按十六进制:", 二进制1.ToHex(按十六进制))
}

跑起来看:输入 ABCD,标签显示「按文本:41 42 43 44 按十六进制:AB CD」。 前者就是你现在蓝牙发出去的内容,后者才是想要的两个字节。

实验二:按字节发出去

把按钮改成真正发送。关键只有一步:先转字节,再交给「发送字节数组」:

when 按钮_发送.Click() {
  var 字节 = 二进制1.FromHex(文本输入框1.Text)
  蓝牙客户端1.SendBytes(字节)
  标签1.Text = join("已发送 ", length(字节), " 个字节:", 二进制1.ToHex(字节))
}

跑起来看:输入 ABCD 点发送,标签显示「已发送 2 个字节:AB CD」。 设备端(或电脑上的蓝牙串口助手,勾选「十六进制显示」)收到的是 AB CD 两个字节,不再是 41 42 43 44。

输入写法很宽容,下面几种都得到同样的 AB CD:ABCD、AB CD、ab cd、AB,CD、0xAB 0xCD、0XAB,0XCD。 空格、逗号、冒号、横线和 0x 前缀都会被忽略,大小写都行。

实验三:输入不对时给出提示

十六进制每个字节是两位,输入 ABC 这种单数位、或者夹了 G、Z 这类不是十六进制的字符,转换会失败: 二进制组件触发屏幕的「出现错误时」,并返回空列表,不会发出任何东西。把提示显示在标签上,而不是弹窗:

when Screen1.ErrorOccurred(组件, 函数名称, 错误编号, 消息) {
  标签1.Text = join("输入有误:", 消息)
}

跑起来看:输入 ABC 点发送,标签显示「输入有误:二进制组件:十六进制位数是单数(3 位),每个字节要两位,如 0A」; 输入 ABCG 显示「输入有误:二进制组件:十六进制文本里只能有 0~9、A~F 和分隔符」。

实验四:设备要求加帧头和校验

不少设备不收裸数据,要求「帧头 + 数据 + 校验」。比如帧头 A5、末尾加异或校验,把实验二的发送改成:

when 按钮_发送.Click() {
  var 帧 = 二进制1.AppendChecksum(二进制1.Build([165, 二进制1.FromHex(文本输入框1.Text)]), "XOR8")
  蓝牙客户端1.SendBytes(帧)
  标签1.Text = join("已发送 ", 二进制1.ToHex(帧))
}

跑起来看:输入 ABCD,标签显示「已发送 A5 AB CD C3」。C3 是 A5、AB、CD 三个字节依次异或的结果。 「拼接字节」一块积木把帧头和输入的字节接在一起;校验类型还可以换成 SUM8、CRC16-MODBUS 等,见计算校验。

常见问题

现象 原因 解决
设备收到 41 42 43 44 用的是「发送文本」 改成「十六进制转字节」+「发送字节数组」
提示「十六进制位数是单数」 输入了奇数个十六进制字符,如 ABC 每个字节写满两位,不足补 0:0ABC
提示「只能有 0~9、A~F 和分隔符」 输入里有 G~Z 或中文标点 只输入 0~9、A~F;分隔用英文空格或逗号
想输入十进制的 171 205 「十六进制转字节」只认十六进制 用文本的「分解」按空格切开:蓝牙客户端1.SendBytes(split(文本输入框1.Text, " ")),数字文本直接当字节
串口助手看到乱码 助手按文本显示 助手勾选「十六进制显示」(HEX 显示)
报错「超出一个字节的范围」 列表里有大于 255 的数 每个字节只能是 0~255;多字节数字用「整数转字节」

平台说明

相关文档

文档反馈