|
楼主 |
发表于 2013-5-6 19:51:22
|
显示全部楼层
本帖最后由 James.Yang 于 2013-5-7 18:27 编辑
第十一章 机器人之间的通信
如果你拥有一个以上的NXT,这一章就是为你而设(虽然你仍然可以通过单台NXT与PC进行数据通信)。机器人可以通过蓝牙无线技术互相通信:你可以使多台机器人协作(或相互争斗),你可以使用两台NXT建立一个大型的复杂的机器人,这样你可以使用6个电机和8个传感器。
对良好的老式RCX,这很简单:它发出红外线消息,周围所有的机器人都能接收。
对于NXT,这将是一个完全不同的方式!首先,你必须通过智能积木块上的蓝牙菜单来连接两个或更多NXT(或NXT与PC连接),只有这样,你才可以将消息发送到连接的设备。
发起连接的NXT被称为主机,通过通道1,2,3最多可以连接3个从设备。从设备总是将主设备连接到通道0。你可以发送消息到10个可用邮箱。
主-从设备通讯
举两个程序例子,一个为主设备,一个为从设备。这些基本的程序将教你如何通过两个NXT无线网络来管理快速连续的字符串消息流。
主程序首先通过BluetoothStatus(conn)函数来检查从设备是否正确连接在通道1上(BT_CONN常数),然后通过SendRemoteString(conn,queue,string)生成并发送以M打头的递增数字串消息,而通过ReceiveRemoteString(queue,clear,string)从从设备接收消息并显示数据。
图11-1 主-从设备通讯
从设备的程序非常相似,只不过使用SendResponseString(queue,string),替代SendRemoteString,因为从设备只可以给它的主设备——通道0——发送信息。
图11-2 从-主设备通讯
你可能注意到,中止其中一个程序,另一个程序将继续发送递增数字串的消息,而并不知道它所有发出的消息都将丢失,因为没有程序在侦听另一个程序。为了避免这个问题,我们可以规划一个更好的协议来相互确认消息的发送。
发送确认号码
下面再举一些例程:这次主设备用SendRemoteNumber(conn,queue,number)来发送数字并等待从设备进行确认(ack)(在until循环内,我们可以看到有ReceiveRemoteString),只有当从设备监听到并发送确认信号后,主设备才接着发送下一条消息。从设备使用ReceiveRemoteNumber(queue,clear,number)简单接收数据并通过SendResponseNumber发送确认信号。你的主从程序必须有共同的确认码,在这些程序中,我选择了十六进制数0xFF。
主设备发送一些随机数,并等待从设备确认,每当收到一个正确的确认码,确认(ack)变量必须被清除,否则,主设备将在没有新确认码下继续发送,因为确认变量成了脏变量。
从设备持续检查邮箱,如果它不为空,显示读取的数值,并给主设备发送一个确认信号。在程序开头,我在没有读取信息情况下直接发送确认信号以防阻塞主设备,事实上,如查没有这一技巧,一旦我们先启动主设备程序,即使我们随后启动从设备,主设备将被挂起。这种方法会丢失前面几个消息,但是你可以在不同的时刻启动主设备和从设备的程序而没有被挂起的风险。
图11-3 主设备程序
图11-4 从设备程序
直接命令
还有另外一个很酷的关于蓝牙通信功能:主设备可以直接控制从设备。
在下面的例子中,主设备直接给从设备发送命令来播放声音和移动电机,它不需要从设备程序,因为是从设备NXT的硬件直接用来接收和管理信息!
图11-5 蓝牙通讯程序
小结
在本章中,我们学习了在机器人之间使用蓝牙通信的一些基本概念:连接两个NXT,发送和接收字符串,数字和等待发送确认信号。当需要一个安全通信协议时,这最后一个点是非常重要的。
作为特别的特征,你也学会了如何直接给从设备智能积木块发送命令。 |
|