使用 select 函数实现更为精确的延时

select 初识

1
2
3
4
5
6
7
8
9
10
11
12
int select(
_In_ int nfds, // 忽略,仅是为了与Berkeley套接字兼容
_Inout_ fd_set *readfds, // 指向一个套接字集合,用来检查其可读性
_Inout_ fd_set *writefds, // 指向一个套接字集合,用来检查其可写性
_Inout_ fd_set *exceptfds, // 指向一个套接字集合,用来检查错误
_In_ const struct timeval *timeout // 指定此函数等待的最长时间,如果为NULL,则最长时间为无限大
);

返回值:
函数调用成功,返回发生网络事件的所有套接字数量的总和
如果超时返回0,代表在描述词状态改变前已超过timeout时间;
当有错误发生时则返回SOCKET_ERROR(-1).

瞎谈 Socket 编程(二)

数据传输方式

  SOCK_STREAM    面向连接        准确性/相对较慢   TCP
  SOCK_DGRAM     无连接的传输方式     视频/音频       UDP
Server
 1. 创建套接字                 int sock = socket(AF_INET, SOCK_STREAM, 0);
 2. 将套接字和IP、端口绑定           bind(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
 3. 进入监听状态,等待客户端请求        listen(…);
                        accept(…);
 4. 接受客户端数据/向客户端发送数据       read(…)/write(…);              
 5. 关闭套接字                 close();

Client
 1. 创建套接字
 2. 向服务器(特定的IP和端口)发送请求       connect(…);
 3. 读取服务器传回的数据/向服务器发送数据    read/write(sock, char*, sizeof(…));
 4. 关闭套接字

瞎谈 Socket 编程(一)

  从项目中一个实例说起,我们的目标是将决策层做出的控制小车的决策(主要是速度velocity还有角速度angular),通过TCP网络传输的方式传递到与控制小车的FPGA相连接的RaspberryPi。也许你会问,为毛要通过网络传输,不能通过其他方式,比如串口,不是会更快点吧?
  Maybe…不过,这是有原因的。
  其一,我觉得应该通过以太网线直接将运行决策的PC机网卡与树莓派上的网卡直接相连接,再用网络传输,应该比串口快,或者说,更稳定高效。遗憾的是,我们没办法通过以太网线直接相连,而是通过WiFi,这是因为,其二,PC机唯有的一个以太网卡,拿去插激光雷达了,而激光雷达作为一个sensor,是决策所必须的。
  其三,整个体系运行在ROS之上,而,把ROS体系中做出来的决策送到控制端的树莓派上,我们得自己想办法或者说Coding。刚好,找到有一个开源的ros通讯,恰好人家是通过TCP传输的,所以,就没想那么多,直接用上了。
  可想而知,这个开源的ros通讯要做的,就是把决策层做出来的velocity和angular,通过tcp传送到运行在树莓派上的程序进而控制FPGA控制小车。搞过ROS的应该知道,在ROS中节点都是通过消息进行通讯的,那么,这个ros通讯节点要做的肯定就是订阅决策层做出来的关于控制的消息,然后通过网络传输出去,这些,你可以阅读 这个开源项目 的源码进行了解。