1

我想用我的笔记本电脑控制多个机器人。机器人没有智能,它们将传感器值发送到 PC,PC 计算传感器值并将结果发送回机器人。(使用 PC 集中控制机器人)。

机器人使用 Zigbee mudule 通过串行通信与 PC 进行通信。

问题:如何制作和发送结构(来自机器人),例如 {sen1, sen2,sen3..,robot id},其中 sen1, sen2.. 是传感器值,机器人 id 用于识别特定机器人。编辑后.....我用于发送传感器的代码就像。

 void TxData(unsigned char tx_data)

{   SBUF = tx_data; //Transmit data that is passed to this function
     while(TI == 0); //wait while data is being transmitted
}

然后一一发送传感器值

 TxData(left_whiteline_sensor);
 TI=0; // resetting transmit interrupt after each character
 TxData(middle_whiteline_sensor);
 TI=0;
 TxData(right_whiteline_sensor);
 TI=0;
 TxData(front_sharp_sensor);
 TI=0;

在 PC 端读取缓冲区中的这些值

read(fd, buf1, sizeof(buf1));
.....
options.c_cc[VMIN]=4; // wait till not getting 4 values 

只有一个机器人时这工作正常,现在我们有多个机器人并且每个机器人都使用上述功能发送数据,我在 PC 端获得所有机器人的混合传感器值。一种解决方案是制作我上面提到的结构并将其发送到 PC。这就是我想问的“如何制作和发送这样的结构”抱歉之前没有正确地提出问题。

谢谢...

4

5 回答 5

1

如果可能,请查看 RS-485。从 PC 的角度来看,它仍然是串行的,并且支持多点。我开发了一个机器人,其中大部分处理都在 PC 端完成,所有其他板都以菊花链的形式连接到一个 RS-485 总线。

于 2010-10-05T16:38:19.980 回答
0

串行协议 RS232 是 point2point。

我的解决方案是使用主/从架构。

原因:避免访问通信渠道问题。

架构:PC 是主机并向其从机进行查询。仅在主请求后保存传输信息。消息应该具有字段 to、from 和 data。所有消息都广播到通信通道。

我已经实施了这个解决方案并且工作正常。

于 2010-11-20T12:42:57.100 回答
0

我不知道您在 PC 上使用什么 API 与端点(机器人)进行通信,但我猜当您发送数据时,您指定短地址、长地址 (MAC) 或某些套接字/您使用长地址或短地址之一打开的文件 ID。另外,我猜机器人 ID 与短地址相同——如果不是,您将需要创建一些代码来在机器人 ID 和短地址之间来回映射。我还猜测您要么使用select系统调用之类的东西来等待来自任何机器人的数据,要么尝试从每个机器人中读取数据。

如果是这种情况,那么您应该能够为每个机器人创建一个状态机,并且每当您从该机器人获取数据时,您都会向该机器人的状态机提供处理它并生成对该机器人的回复(甚至将数据发送给另一个机器人)机器人的状态机)。状态机几乎就像您的单个机器人程序,除了它将依赖一个事件循环从机器人获取数据。您可能还希望事件循环能够为状态机提供计时器警报。这类似于您编写一个可以同时处理多个客户端的 http 服务器的方式。

如果我对您的 API 完全错误,并且您的 zigbee 无线电仅充当没有电线的串行端口,那么您将一团糟,因为我认为您必须重新配置它们才能在一个端点上使用多个端点时间 - 并且必须更改用于与机器人通信的 API。

于 2010-09-10T18:39:17.607 回答
0

这有点违背了目的,因为 RS-232 不是总线,这意味着您没有地址空间。您需要将 RS-232 线路连接到控制器,该控制器为您的电机或其他设备运行总线。并且基本上将数据从控制器封装到计算机上运行的软件中。

于 2010-09-11T06:15:48.683 回答
0

听起来您需要创建一个协议来在“机器人”和 PC 之间进行通信。它可能看起来像这样:

字节值说明
 1 0xAA 第一个同步字节
 2 0x55 第二个同步字节
 3 seq 消息序列号,每传输一条新消息递增
 4 1 消息类型(1 = 车轮编码器报告)
 5 5 后面的数据字节数
 6 ID 机器人 ID
 7 FL 左前轮编码器
 8 FR 前右轮编码器
 9 RL 左后轮编码器
 10 RR 右后轮编码器
 11 CS 字节 1 - 10 的校验和

现在,如果消息不是以离散数据包(即 UDP)的形式发送,而是通过串行端口异步发送,那么来自不同机器人的消息字节可能会混合在一起。上述协议至少会验证接收到的消息的完整性,但接收到有效消息的概率会随着同时传输到 PC 的机器人数量的增加而降低。

解决异步问题的一种方法是将机器人 ID 嵌入到传输的每个字节中。如果机器人不超过 16 个,那么它们的 ID 可以放在传输字节的高半字节,而 4 位数据则放在低半字节。然后它将需要两个传输字节来发送一个数据字节:0x1F + 0x13 = 0x3F 来自 bot #1。这将使您的消息大小加倍,并且需要接收端的代码将传入数据打包到每个机器人的单独接收队列中。

于 2010-10-01T13:54:03.217 回答