在寻找序列化-反序列化选项时,我遇到了用于使用谷歌协议缓冲区的32位控制器的nanopb。
当我好奇地尝试在gsm调制解调器上进行mqtt通信时,我意识到我无法让nanopb的编码机制知道如何处理转义字符/特殊字符,例如CTRL + Z,因为它们都以十六进制格式编码。(例如;十六进制中的 CTRL+Z 是 0x1A(,gsm 调制解调器使用 0x1A 作为消息终止字符。因此,当通过 AT 命令向调制解调器发送 nanopb 编码消息时,调制解调器会将包含 0x1A 的编码消息解释为 CTRL+Z,而这不应该解释为CTRL+Z。
在这种情况下可以使用nanopb吗?还是我做错了什么?
这是调制解调器的一个非常常见的问题,适用于任何二进制数据。所有调制解调器都有传输二进制数据的方法,但该方法可能因调制解调器型号而异。
最常见的方法是:
- 使用两个 UART,一个用于命令,一个用于数据。
- 使用 AT 命令和转义序列在命令和数据模式之间切换。通常用
ATD
或ATO
切换到数据模式,然后暂停+++
暂停切换回命令模式。在转义序列中使用暂停可防止其他数据中发生的+++
导致问题,但会减慢传输速度。 - 使用单独的信号线(通常
DTR
(在命令和数据模式之间切换。 - 转义带有前缀的二进制字符,例如
DLE
=0x10
字符,这会更改以下字符的含义。
您的调制解调器很可能至少支持其中一种甚至多种方法,但您需要查看其手册以了解如何配置它。