根据不同的实际情况,客户机/服务器的通信存在对称和非对称两种方式。在对称的方式下,通信的每一方都可能扮演主从角色;在非对称的方式下,一方不可改变的认为是主机,而另一方则是从机。无论是对称的或是非对称的,当服务被提供时必然存在客户进程和服务进程。基于UDP协议的通信既可采用对称方式也可采用非对称方式。
3.2 数据报套接字
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
UDP协议支持数据报套接字。这种套接字可以采用客户/服务器模式,以全双工方式工作,接收发送可以同时进行,但并不保证数据传输的可靠性、有序性和无重复性,需要由程序员负责管理数据报的排序和可靠性。
3.3 使用Dynamic C实现UDP报文的传输
Dynamic C提供了许多支持TCP/IP协议的库函数。其中,DCRTCP.LIB是最主要的函数库。
下面将简要介绍UDP协议下的基本通信流程。
3.3.1 调用本地初始化函数
void sock_init(void)
该函数将使用默认配置初始化本地信息包驱动器以及DCRTCP.LIB函数库。该函数必须在其他网络库函数被使用前进行调用。
3.3.2 打开数据报套接字
int udp_open( *s, lport, remote_IP, port, *data_handler ())
其中的参数解释如下:
s : 指向UDP套接字的指针;
lport : 本地协议端口;
remote_IP : 可接受的远地主机IP地址,如果该项为-1,则支持广播通信;
port : 可接受的远地进程协议端口,如果该项为-1,则为广播数据报;
data_handler() : 如果接收到数据则调用该函数;
该函数的返回值,如果成功返回非零,否则返回零值。
3.3.3 接收远地主机发送的数据报
int udp_recv( *s, *buf_recv, recv_len)
当套接字初始化后用该函数扫描接收缓冲区,,察看是否有数据报到达。其中,
buf_recv : 指向用于存放已到达数据报的数组的指针;
recv_len : 存放数据报的数组的大小。
如果接收到数据报则返回数据报的长度;否则返回-1。
3.3.4 发送数据报给远地主机
int udp_send( *s, *buf_send, send_len )
调用该函数发送数据报给远地主机。如果成功返回该数据报的长度,否则返回-1。
buf_send : 指向待发送数据报的指针;
send_len : 待发送数据报的长度。
3.3.5 网络信息处理函
int tcp_tick( *s )
该函数将察看网络连接状态,检查数据报的到达情况,处理新到数据报并重传丢失的数据报。若出现网络连接被复位及套接字已关闭的情况或参量s为NULL,则返回值为零;否则返回非零值。
3.3.6 关闭套接字
void sock_close( *s )
当数据传送工作完成或传送过程中发生错误时,可调用该函数关闭套接字
4 串口通信的实现
4.1 RS232电平与TTL电平的转换
PC机的串行接口是符合EIA RS-232C规范的外部总线标准接口,而RCM2200配备有四个串行接口,都是采用TTL电平,因此两者之间必须进行电平转换。以RCM2200的串行口C(位于核心模块的J4插槽上)为例,电平转换如图2所示。
图2 RS232与TTL电平转换图
注册
个人空间
