我需要使用serialport从节点服务器发送命令Xmega。 例如,我希望我的命令采用以下格式: < M 500
其中:
<标记命令的开头(字符串)
M是命令(字符串)
500是整数值(可以在0到500之间)
是否可以通过串口发送这样的命令?如果是这样,那么我必须将我的命令作为缓冲区发送吗?
如何将500之类的intgers插入缓冲区?需要转换为十六进制字节(如何)?
如果命令作为缓冲区发送,输入数据在Xmega端看起来如何?缓冲区中的所有元素都是1乘1?
此致 Margus
答案 0 :(得分:0)
“串口”背后的协议是RS-232 作为每个通信协议,它处理符号和帧,并且它与它正在传输的有效载荷无关。
这意味着有效载荷格式完全取决于您 RS-232 可以处理8位有效负载,因此即使在发送二进制数据时也不需要任何奇特的位操作(当然,我假设您的机器有8位字节)。
所以,长话短说,你可以发送任何你想要的东西。
我完全不知道你为什么要使用node.js这样做,因为JS没有整数的概念(我不知道Node.js,它可能有。在这种情况下忽略最后一句)。<登记/> 无论如何,为了写入串口,您需要从操作系统获得帮助 如果您使用的是Linux,则可以从here开始 基本上写入串口就像写入文件一样 在Windows上,执行same。
所有这一切归结为将字符串写入文件,我假设您知道如何在Node.js中执行此操作。
不要忘记以正确设置 RS-232 的设置(限制速率,奇偶校验,启动/停止)。说真的,不要。
这很容易,它只是归结为处理一堆寄存器 我不会详细解释如何进行操作,因为您可以访问AVR数据表以获取更多信息。
无论如何here一个页面,显示如何读取串口以避免轮询。
由于在 XMega 方面,您将一次收到一个八位字节的有效载荷,具有可变长度的消息,整数编码为字符串将只是一个痛苦的背面。
然而,这取决于您更熟悉哪种语言。
如果我是你我会选择一种简单的有效负载格式:
op immediate
其中op
是8位操作码,类似
00h = Nop
01h = Command 1
02h = Command 2
...
和immediate
是命令的两个八位字节数据字段
这样每个命令都是三个八位字节长,你收集这三个八位字节然后开始处理。
您应该注意的一个问题是同步。
如果出于同样的原因,您的服务器和 XMega 软件不同步,则不会正确处理将来的命令。
您可以使用自动同步技术,例如 UTF-8 :保留每个八位字节的MSb以进行同步。
0ooo oooo 10ii iiii 11ii iiii
ooo oooo = 7 bit opcode
ii iiii ii iiii = 12 bit immediate
数字位固定且字母位是实际有效负载: o 是(7位)操作码的位, i 是位(12位)有效载荷。
这为您提供了128个可能的命令,每个命令的编号最多为4095作为操作数,您可以轻松地判断命令中的哪个位置来自一个字节,从而可以从失去同步中恢复。
如果您不需要32个命令,可以进一步缩小到两个八位字节
0ooo ooii 1iii iiii
这给出了5位操作码和9位(最多512个)操作数。自动同步。