USB dongle协议
USB dongle与PC 程序之间的通信例子说明 简介USB dongle和PC 之间使用USB 相连,并在PC 上虚拟成一个串口。PC 程序通过使用相应的协议读写该串口,从而操作USB dongl
USB dongle与PC 程序之间的通信例子说明 简介
USB dongle和PC 之间使用USB 相连,并在PC 上虚拟成一个串口。PC 程序通过使用相应的协议读写该串口,从而操作USB dongle。
USB dongle在PC 之间起到收发数据的功能:
USB dongle接收来自PC 的数据发送命令,从中解析出目的地址和数据内容后,将数据发送到该地址的USB dongle;
USB dongle在接受来自其他USB dongle的数据包后,从中解析出目的地址、源地址、数据内容等信息,并将这些信息发送到PC
串口通信协议
通信模式
USB dongle和PC 之间以包的形式进行通信。这是通过在原始的基于字节流读取和写入的串口的基础上,使用特定的组包结构,对串口中所传输的数据进行封包,使用包的方式进行串口两端设备之间的数据传输。
这种基于串口包的数据传输方式将串口两端的设备(此处分别为PC 程序和USB dongle)看做一个拥有唯一地址标识(PAN 和短地址)的通信设备,并在串口包中携带该串口包所对应的目标地址和源地址。
使用串口包的通用格式,PC 程序和USB dongle之间可以进行各种数据的交互(数据被存放在有效载荷中),从而实现相应的功能:
通信协议 串口包格式
各个字段的说明如下:
前导字符:用于标识一个包的开始,内容为0xF0F0
,●
●
●
●
●
●
●
●
●
●
●
●
包长度:包括从“序号”到“有效载荷”的长度 序号:取值0到255,总是递增(255 0除外) 目标PAN/目标短地址:串口包的目的地址 固定为0xFFFF / 0xFFFF 源PAN/源地址:串口包的源地址 PC 发包到USB dongle时,总是填写 0 / 0 USB dongle到PC 的串口包中,该两字段为USB dongle的地址 包类型:固定填写0x11(不会收到包类型不是0x11的串口包) 端口: 发送串口包到USB dongle时固定填写8080(10进制) 接受串口包时,过滤(忽略)端口不是8080的串口包 CRC 校验:从“序号”到“有效载荷”的CRC16校验。该CRC 校验代码可在Demo 程序中找到。
节点功能
USB dongle和PC 之间的通信协议主要包括如下三个功能:
● 获取USB dongle的节点地址
● 使用USB dongle发送数据
● USB dongle将接收到的其他节点的数据发送到PC
下面所述的USB dongle和PC 程序所发送的各种信息,都是指在串口包中的有效载荷中的内容,而串口包本身的结构式固定的。必须先将命令和串口包的包头等额外内容一起打包成串口包,并通过串口发送。
获取USB dongle的节点地址
通信过程:
● PC 端发送:’ga’(2个字节)
● USB dongle回复:’100
注意事项:
● PC 程序应该在启动后就获取节点的PANID 和短地址,从而获知自己的地址,并且
相互之间进行通信
● 命令和回复都是以字符串的形式发送和返回,其中PanId 和短地址以16进制表示 ● USB dongle的回复分为以空格分隔的3个部分,其中:
⏹ 第一个值为错误码,’100’代表命令执行正确(参见PPT 末尾的错误码列表) ⏹ PanId 为USB dongle的PanId
⏹ 短地址为USB dongle的短地址
使用USB dongle发送数据
通信过程:
,● PC 端发送:发送命令包
● USB dongle解析并进行发送
● USB dongle将发送结果返回到PC
发送命令包结构:
发送结果返回:‘100’
注意事项:
● 无法确定对方是否成功接收
使用USB dongle接收数据
USB dongle在接收到数据时,就将所收包的信息发送到PC 。 USB dongle发送到PC 的数据回显包结构:
注意事项:
● 数据回显中没有源PAN 的字段,无法得到发送者的PANID 串口编程
需要使用串口库进行串口的读写。Demo 程序中有现成的一个串口库。 如何连接串口
∙ 首先需要安装USB dongle的驱动
∙ 按照如下配置打开串口
• 串口号:查看设备管理器获得
• 波特率:230400
• 数据位:8
• 校验位:无
• 停止位:1
如何发送串口包
∙ 将发送命令、获取地址命令等有效载荷封装在串口包中,然后通过串口操作函数发
,送到串口
∙ 必须保证串口包中字段的正确性
• 参考前面的“通信协议-串口包格式”
如何接受串口包
∙ 程序必须解析来自串口的字符流,从而读取串口包
∙ 注意事项
• 不能保证一个串口包的数据在一次串口消息(串口读取)中全部获得
• 程序必须过滤端口不是8080的串口包,因为USB dongle会向串口打印某些
额外的信息
举例说明
节点地址获取
获取USB dongle地址是通过发送”gt ”命令实现的,一个典型的通信过程如下:
PC 端程序向串口发送(使用‘|’分隔各个字段):
| F0 F0 | 0E | 00 | FF FF | FF FF | 00 00 | 00 00 | 11 | 90 1F | 67 61 | FF 15 |
参考“通信协议-串口包格式”可以得知如下的信息:
● 包长度为0xE
● 包序列号为0
● 目标PAN 和目标短地址都是0xFFFF
● 源PAN 和源短地址都是0
● 包类型为0x11
● 端口为0x1F90,既十进制的8080
● 有效载荷为0x67,0x61,既”gt ”
● CRC16校验为 0x15FF
USB dongle向串口发送:
| F0 F0 | 14 | B3 | FF FF | FF FF | 01 00 | 10 00 | 11 | 90 1F | 31 30 30 20 31 20 31 30 | B4 D0 | 参考串口包格式,可以得知如下的信息:
● 包长度为0x14
● 序列号为0x83
● 目标pan 和目标短地址为0xFFFF:0xFFFF
● 源PAN 和源短地址为USB dongle 的PAN 和短地址,分别为0x0001和0x0010,这
是为每个USB dongle唯一分配的。
● 端口号为0x1F90,既8080
● 有效载荷为字符串:”100 1 10”
● CRC16校验为0xD0B4
因此,PC 程序在读取整个串口包后,可以解析出其中的有效载荷“100 1 10”,既错误码:100,PAN :1,短地址:10。
,发送数据到其他节点
PC 程序发送携带数据发送命令的串口包:
F0 F0 17 1F FF FF FF FF 00 00 00 00 11 90 1F 53 01 00 11 00 05 01 02 03 04 05 59 ED 根据串口包协议,可以获知:
有效载荷中的数据发送命令为:53 | 01 00 | 11 00 | 05 | 01 02 03 04 05
根据发送命令包:
● 命令字符为’S ’
● 目标PAN 为0x0001
● 目标短地址为:0x0011
● 数据长度为:0x05
● 数据内容为:0x01 0x02 0x03 0x04 0x05
USB dongle 在收到该发送命令包后,从中解析出目标地址为:0x0001:0x0011,和待发送的数据。USB dongle 将数据通过无线通信模块向目的节点:0x0001,0x0011发送(所发送包的结构参考P36. CC2420.pdf)。
相应的,接收数据的USB dongle 在无线通信模块接收到包后,通过串口发送如下的数据回显包:
F0 F0 1D 7B FF FF FF FF 01 00 11 00 11 90 1F 52 18 01 00 11 00 10 00 FF 9D 6C 05 01 02 03 04 05 02 BB
从中我们可以看出该串口包的有效载荷为:| 52 | 18 | 01 00 | 11 00 | 10 00 | FF | 9D 6C | 05 | 01 02 03 04 05
根据USB dongle的数据回显包的格式,可以解析如下:
● 首字符为’R ’
● 递增序号为1
● 目标PAN 为0x0001
● 目标短地址为0x0011
● 源(发送者)短地址为0x0010
● LQI 为0xFF
● CRC 校验(802.15.4包的CRC 校验)为0x9C9D
● 数据长度为5
● 数据内容为0x01 0x02 0x03 0x04 0x05