精华内容
下载资源
问答
  • 单线半双工通信的官方资料 单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态: ● USART_CR2寄存器的LINEN和CLKEN位 ● USART_CR3寄存器的SCEN和IREN位 USART可以配置...
  • 单线半双工通信.zip

    2020-04-04 14:33:26
    单线实现两块STM32通信,作为个人笔记的附带内容,涉及知识面窄。用正点原子STM32精英版与最小系统板通信通信协议模拟AX12数字舵机的通信规则。
  • stm32uart单线半双工通信 在使用数字舵机时,所用到的通信方式为uart通信,但舵机只有三根接线,出去vcc和gnd,只有一条通信线,也就是说要实现双向通信,只能使用单线半双工模式,本人在利用stm32标准库配置uart...
  • 基于STM32F103串口2的单线半双工收发,内嵌Dynamixel新版通信协议(protoco 2.0),代码简单好用。
  • 文章目录 TCP协议/UDP协议介绍 三种通信方式 实现TCP半双工通信 所用到的结构体与函数 源代码 运行结果 实现UDP半双工通信 源代码 运行结果 参考文章 TCP协议/UDP协议介绍 TCP/IP(Transmission Control Protocol/...

    TCP协议/UDP协议介绍

    • TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议
    • 下面我们来简要了解TCP/IP的四层模型:
      网络接口层:负责将二进制流转换为数据帧,并进行数据帧的发送和接收。数据帧是网络信息传输的基本单元,ARP和RARP协议
      网络层:负责将数据帧封装成IP数据报,同时负责选择数据报的路径,即路由,IP和ICMP协议
      传输层:负责端到端之间的通信会话连接与建立,传输协议的选择根据数据传输方式而定,UDP和TCP协议
      应用层:负责应用程序的网络访问,这里通过端口号来识别各个不同的进程,FTP、TELNET、DNS、SMTP、POP3 协议

    • Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。

    • 传输控制协议(TCP,Transmission Control Protocol) 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

      TCP三次握手过程
      第一次握手:主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B,向主机B 请求建立连接,通过这个数据段, 主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
      第二次握手:主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用那个序列号作为起始数据段来回应我
      第三次握手:主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了,这样3次握手就完成了,主机A和主机B 就可以传输数据了。

      TCP建立连接要进行3次握手,而断开连接要进行4次
      第一次: 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求 ;
      第二次: 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;
      第三次: 由B 端再提出反方向的关闭请求,将FIN置1 ;
      第四次: 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.。
      由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式, 大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互, 为数据正式传输打下了可靠的基础。

    • UDP(User Datagram Protocol) 全称是用户数据报协议,是一种非面向连接的协议,这种协议并不能保证我们的网络程序的连接是可靠的,而TCP是面向连接的,提供可靠的字节流。然而,有些情况下更适合用UDP而不是TCP。有些流行的应用程序是用UDP实现的:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)就是这样的例子。
      1.UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

      2.由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等, 因此一台服务机可同时向多个客户机传输相同的消息。

      3.UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

      4.吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、 源端和终端主机性能的限制。

      5.UDP使用尽最大努力交付,即不保证可靠交付, 因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

      6.UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界, 因此,应用程序需要选择合适的报文大小。

      我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常, 其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包, 如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

    • 小结TCP与UDP的区别:

      1、基于连接与无连接;

      2、对系统资源的要求(TCP较多,UDP少);

      3、UDP程序结构较简单;

      4、流模式与数据报模式 ;

      5、TCP保证数据正确性,UDP可能丢包;

      6、TCP保证数据顺序,UDP不保证。 ## 三种通信方式


    三种通信方式

    1、单向通信:又称为单工通信,即只能有一个方向的通信而没有反方向的交互。无线电广播或有线电广播以及电视广播就属于这种类型。
    单向通信只需要一条信道,而双向交替通信或双向同时通信则都需要两条信道(每个方向各一条)。显然,双向同时通信的传输效率最高。不过应当指出,虽然电信局为打电话的用户提供了双向同时通信的信道,但有效的电话交谈一般都还是双方交替通信。当双方发生争吵时往往就是采用双向同时通信的方式。

    2、半双工通信,是指数据可以沿两个方向传送.但同一时刻一个信道只允许单方向传送,因此义被称为双向交替通信。例如,无线对讲机就是一种半双工设备,在同一时间内只允许一方讲话。

    3、全双工通信,是指同时发生在两个方向上的一种数据传输方式,如图中©所示。电话机就是一种全双工设备,其通话双方可以同时进行对话。计算机之间的高速数据通信也是这种方式。

    双向交替通信又称为半双工通信,即通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收)。这种通信方式是一方发送另一方接收,过一段时间后再反过来。此次要实现的就是半双工通信


    实现TCP半双工通信

    基于TCP协议的socket的server端程序编程步骤:
    1、建立socket ,使用socket()
    2、绑定socket ,使用bind()
    3、打开listening socket,使用listen()
    4、等待client连接请求,使用accept()
    5、收到连接请求,确定连接成功后,使用输入,输出函数recv(),send()与client端互传信息
    6、关闭socket,使用close()

    基于TCP协议的socket的Client程序编程步骤:
    1、建立socket,使用socket()
    2、通知server请求连接,使用connect()
    3、若连接成功,就使用输入输出函数recv(),send()与server互传信息
    4、关闭socket,使用close()

    所用到的结构体与函数

    1.IPV4套接字地址结构体:

    struct sockaddr_in{
        uint8_t             sin_len;
        sa_famliy_t         sin_fanliy;/*协议家族*/
        in_port_t           sin_port;/*端口号*/
        struct in_addr      sin_addr;/*IP地址,struct in_addr{in_addr_t s_addr;}*/
        char                sin_zero[8];
    };
    

    2.通用套接字地址结构体:

    struct sockaddr{
        uint8_t       sa_len;
        sa_famliy     sa_famliy;
        char          sa_data[14];
    };
    

    3.socket():

    int socket(int domain,int type, int protocol);
    /*
    创建一个套接字:
    返回值:
        创建成功返回一个文件描述符(0,1,2已被stdin、stdout、stderr占用,所以从3开始)
        失败返回-1。
    参数:
        domain为协议家族,TCP属于AF_INET(IPV4);
        type为协议类型,TCP属于SOCK_STREAM(流式套接字);
        最后一个参数为具体的协议(IPPOOTO_TCP为TCP协议,前两个已经能确定该参数是TCP,所以也可以填0)
    */
    
    

    4.bind():

    int bind(int sockfd,const struct sockaddr * addr,socklen_t addrlen);
    /*
    将创建的套接字与地址端口等绑定
    返回值:成功返回0,失败返回-1.
    参数:
        sockfd为socket函数返回接受的文件描述符,
        addr为新建的IPV4套接字结构体
        注意:定义若是使用struct sockaddr_in(IPV4结构体)定义,但是该参数需要将struct sockaddr_in *类型地址强转为struct sockaddr *类型(struct sockaddr是通用类型)。
        最后一个参数为该结构体所占字节数。
    */
    

    5.listen():

    int listen(int sockfd,int backlog);
    /*
    对创建的套接字进行监听,监听有无客户请求连接
    返回值:有客户请求连接时,返回从已完成连接的队列中第一个连接(即完成了TCP三次握手的的所有连接组成的队列),否则处于阻塞状态(blocking)。
    参数:
    sockfd依然为socket函数返回的文件描述符;
    blocklog为设定的监听队列的长度。可设为5、10等值但是不能大于SOMAXCONN(监听队列最大长度)
    */
    
    

    6.connect()和accept():

    int connect(int sockfd,const struct sockaddr * addr,socklen_t addrlen);
    /*
    客户端请求连接
    返回值:成功返回0,失败返回-1
    参数:客户端的socket文件描述符,客户端的socket结构体地址以及结构体变量长度
    */
    int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen);
    /*
    从监听队列中接收已完成连接的第一个连接
    返回值:成功返回0,失败返回-1
    参数:服务器socket未见描述符,服务器的socket结构体地址以及结构体变量长度
    */
    

    7.send()和recv():

    ssize_t send(int sockfd,const void * buf,size_t len,int flags);
    /*
    发送数据
    返回值:成功返回发送的字符数,失败返回-1
    参数:buf为写缓冲区(send_buf),len为发送缓冲区的大小,flags为一个标志,如MSG_OOB表示有紧急带外数据等
    */
    ssize_t recv(int sockfd,void *buf, size_t len, int flags);
    /*
    接收数据
    返回值参数与send函数相似
    不过send是将buf中的数据向外发送,而recv是将接收到的数据写到buf缓冲区中。
    */
    

    8.close():

    int close(int fd);
    /*
    关闭套接字,类似于fclose,fd为要关闭的套接字文件描述符
    失败返回-1,成功返回0
    */
    

    源代码

    服务端:

    tcp_server.c

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdio.h>
    
    int main( int argc, char **argv ) /*接收IP地址和端口号*/
    {
    	int sid = socket(AF_INET,SOCK_STREAM,0);
    	//创建socket,第一个参数使用IPv4协议,第二个参数使用流的方式传播,第三个参数默认为0
    	struct sockaddr_in addr = {0};  		//定义ip地址
    	addr.sin_family = AF_INET;      		//声明协议用的是IPv4
    	addr.sin_port = htons(atoi(argv[2])); 	//绑定到哪一个端口号当中,从第三个参数中获取
    	
    	addr.sin_addr.s_addr = inet_addr(argv[1]); //监听哪一个ip地址,从第二个参数中获取
    	int res = bind(sid,(struct sockaddr *)&addr,sizeof(struct sockaddr));//进行绑定,第二个参数为绑定的地址和端口号
    	printf("bind res = %d\n",res);	//绑定成功输出0,失败则输出-1
    	listen(sid,10);
    	//进行监听,第一个参数是监听哪一个socket,第二个是能接受的最大的连接数
    	char read_buf[128] = {0};  //储存客户端发来的信息
    	char write_buf[128] = {0}; //储存服务端发送的信息
    	int len,cid;
    	cid = accept(sid,NULL,NULL);//返回客户端的描述符,通过cid可以跟客户端通信
    	while(1)
    	{
    		bzero(read_buf,sizeof(read_buf)); //置字节字符串的前n个字节为零,达到清空之前的信息的目的
    		bzero(read_buf,sizeof(write_buf));
    		read(cid,read_buf,sizeof(read_buf)-1);
    		if(strcmp(read_buf,"quit\n") == 0) //如果收到的信息为quit便结束通信
    		{
    		   printf("client quit the communication!\n");
    		   break;
    		}
    		   printf("client:%s",read_buf); //输出客户端发送的信息
    		   printf("server:");			
    		fgets(write_buf,sizeof(write_buf),stdin);
    		write(cid,write_buf,strlen(write_buf));	
    		if(strcmp(write_buf,"quit\n") == 0) //发出信息quit,结束本次通信
    		{
    		   printf("sever quit the communication!\n");
    		   break;
    		}
    		
    	}
    	close(cid);
    	close(sid);	
    }
    

    客户端:

    tcp_client.c

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdio.h>
    
    int main(int argc,char **argv) /*接收IP地址和端口号*/
    {
    	if(argc < 3)		//参数必须为三个
    	{
    		perror("param must >= 3");
    		return -1;
    	}
    
    	int cid = socket(AF_INET,SOCK_STREAM,0); 
    	struct sockaddr_in saddr = {0};//存放要连接的服务器的ip地址和端口号
    	saddr.sin_family = AF_INET;
    	saddr.sin_port = htons(atoi(argv[2]));
    	saddr.sin_addr.s_addr = inet_addr(argv[1]);
    
    	int res = connect(cid,(struct sockaddr *)&saddr,sizeof(struct sockaddr)); //跟服务器连接,成功返回0,失败返回-1
    	printf("connect res = %d\n",res);
    
    	char read_buf[128] = {0};	//储存客户端发来的信息
    	char write_buf[128] = {0};	//储存服务端发送的信息
    	while(1)
    	{
    		bzero(read_buf,sizeof(read_buf));   //置字节字符串的前n个字节为零,达到清空之前的信息的目的
    		bzero(write_buf,sizeof(write_buf)); 
    		printf("client:");
    		fgets(write_buf,sizeof(write_buf),stdin);
    		send(cid,write_buf,strlen(write_buf),0);
    		if(strcmp(write_buf,"quit\n") == 0) //如果发送的信息为quit便结束本次通信  
    		{
    		   printf("client quit the communication!\n");
    		   break;
    		}
    		recv(cid,read_buf,sizeof(read_buf)-1,0);
    		if(strcmp(read_buf,"quit\n") == 0) //如果收到的信息为quit便结束通信
    		{
    		   printf("sever quit the communication!\n");
    		   break;
    		}
    		printf("server:%s",read_buf);	//输出客户端发送的信息
    	}
    	close(cid);
    }
    

    运行结果

    127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。

    在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包。

    运行程序需要打开Linux中打开两个终端,分别编译运行服务端和客户端的源文件,IP地址选择本地地址,端口号建议选择8000以上比较稳定比如9999,首先客户端发送信息到服务端,服务端在接收到客户端的信息后才可以回复,双方都可以输出quit来结束本次通信

    客户端:

    服务端:

    实现UDP半双工通信

    基于UDP协议的socket的接收端编程步骤:
    1、建立socket,使用socket()
    2、绑定socket,使用bind()
    3、以recvfrom()函数接收发送端传来的数据
    4、关闭socket,使用close()

    基于UDP协议的socket的发送端编程步骤:
    1、建立Socket,使socket()
    2、用sendto()函数向接收端发送数据。
    3、关闭socket,使用close()函数

    源代码

    接收端:

    udp_recvpp.c

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc,char **argv)
    {
    	if(argc < 3)
    	{
    		perror("param must >= 3");
    		return -1;
    	}
    
    	int cid = socket(AF_INET,SOCK_DGRAM,0);
    	if(cid < 0)
    	{
    		perror("socket error");
    		return -1;
    	}
    
    	struct sockaddr_in addr = {0},sendaddr = {0};
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(atoi(argv[2]));
    	addr.sin_addr.s_addr = inet_addr(argv[1]);
    
    	int res = bind(cid,(struct sockaddr *)&addr,sizeof(struct sockaddr));
    	printf("bind res = %d\n",res);
    
    	char read_buf[128] = {0};
    	char write_buf[128] = {0};
    	int size = sizeof(struct sockaddr);
    
    	while(1)
    	{
    		bzero(read_buf,sizeof(read_buf));
    		bzero(write_buf,sizeof(write_buf));
    		recvfrom(cid,read_buf,sizeof(read_buf) - 1,0,(struct sockaddr *)&sendaddr,&size);
    		if(strcmp(read_buf,"quit\n") == 0)
    		{
    		   printf("send quit the communication!\n");
    		   break;
    		}
    		char ipbuf[16] = {0};
    		inet_ntop(AF_INET,&sendaddr.sin_addr.s_addr,ipbuf,sizeof(ipbuf));
    		printf("send:%s",read_buf);
    		printf("send addr: ip = %s,port = %d\n",ipbuf,ntohs(sendaddr.sin_port));
    		 printf("recv:");
    		fgets(write_buf,sizeof(write_buf),stdin);
    		sendto(cid,write_buf,strlen(write_buf),0,(struct sockaddr *)&sendaddr,sizeof(struct sockaddr));
    		if(strcmp(write_buf,"quit\n") == 0)
    		{
    		   printf("you quit the communication!\n");
    		   break;
    		}
    		
    	}
    	close(cid);
    }
    

    发送端:

    udp_sendpp.c

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <string.h>
    int main(int argc,char **argv)
    {
    	if(argc < 3)
    	{
    		perror("param must >= 3");
    		return -1;
    	}
    
    	int cid = socket(AF_INET,SOCK_DGRAM,0);
    	if(cid < 0)
    	{
    		perror("socket error");
    		return -1;
    	}
    
    	struct sockaddr_in addr = {0},sendaddr = {0};
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(atoi(argv[2]));
    	addr.sin_addr.s_addr = inet_addr(argv[1]);
    
    	int size = sizeof(struct sockaddr);
       	char read_buf[128] = {0};
    	char write_buf[128] = {0};
    	int len;
    	while(1)
    	{
    		bzero(read_buf,sizeof(read_buf));
    		bzero(write_buf,sizeof(write_buf));
    		printf("send:");
    		fgets(write_buf,sizeof(write_buf),stdin);
    	 len = sendto(cid,write_buf,strlen(write_buf),0,(struct sockaddr *)&addr,sizeof(struct sockaddr));
    	   printf("send successful!!send len = %d\n",len);
    
    		if(strcmp(write_buf,"quit\n") == 0)
    		{
    		   printf("you quit the communication!\n");
    		   break;
    		}
    		recvfrom(cid,read_buf,sizeof(read_buf) - 1,0,(struct sockaddr *)&sendaddr,&size);
    		if(strcmp(read_buf,"quit\n") == 0)
    		{
    		   printf("recv quit the communication!\n");
    		   break;
    		}
    		printf("recv:%s",read_buf);
    	}
    
    	
    
    	close(cid);
    }
    

    运行结果

    发送端:

    接收端:


    参考文章

    https://blog.csdn.net/apollon_krj/article/details/53398448
    https://zhuanlan.zhihu.com/p/24860273
    https://www.cnblogs.com/lightice/p/12726717.html



    本文结束,感谢您的阅读!

    展开全文
  • 单片机软件模拟UART半双工通信的设计.pdf
  • 本程序可以实现24L01的半双工通信,并可从从串口读出收到的数据
  • 半双工通信和全双工通信的区别

    千次阅读 2019-09-22 14:15:53
    半双工通信和全双工通信的区别 对于点对点之间的通信,按照消息传送的方向与时间关系,通信方式可分为单工通信、半双工通信及全双工通信三种。 单工通信 单工通信(Simplex Communication)是指消息只能单方向...

    半双工通信和全双工通信的区别

    对于点对点之间的通信,按照消息传送的方向与时间关系,通信方式可分为单工通信、半双工通信及全双工通信三种。

    单工通信

    单工通信(Simplex Communication)是指消息只能单方向传输的工作方式。

    在单工通信中,通信的信道是单向的,发送端与接收端也是固定的,即发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。基于这种情况,数据信号从一端传送到另外一端,信号流是单方向的。

    例如:生活中的广播就是一种单工通信的工作方式。广播站是发送端,听众是接收端。广播站向听众发送信息,听众接收获取信息。广播站不能作为接收端获取到听众的信息,听众也无法作为发送端向广播站发送信号。

    通信双方采用“按——讲”(Push To Talk,PTT)单工通信属于点到点的通信。根据收发频率的异同,单工通信可分为同频通信和异频通信

    半双工通信

    半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。

    在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。

    例如:对讲机是日常生活中最为常见的一种半双工通信方式,手持对讲机的双方可以互相通信,但在同一个时刻,只能由一方在讲话。

    全双工通信

    全双工通信(Full duplex Communication)是指在通信的任意时刻,线路上存在A到B和B到A的双向信号传输。 全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。这种方式要求通讯双方均有发送器和接收器,同时,需要2根数据线传送数据信号。(可能还需要控制线和状态线,以及地线)。

    理论上,全双工传输可以提高网络效率,但是实际上仍是配合其他相关设备才有用。例如必须选用双绞线的网络缆线才可以全双工传输,而且中间所接的集线器(HUB),也要能全双工传输;最后,所采用的网络操作系统也得支持全双工作业,如此才能真正发挥全双工传输的威力。

    例如:计算机主机用串行接口连接显示终端,而显示终端带有键盘。这样,一方面键盘上输入的字符送到主机内存;另一方面,主机内存的信息可以送到屏幕显示。通常,往键盘上打入1个字符以后,先不显示,计算机主机收到字符后,立即回送到终端,然后终端再把这个字符显示出来。这样,前一个字符的回送过程和后一个字符的输入过程是同时进行的,即工作于全双工方式

    下图说明了三者的通信方式的不同:

     【扩展资料】

    单工、半双工和全双工是电信计算机网络中的三种通信信道。这些通信信道可以提供信息传达的途径。通信信道可以是物理传输介质或通过多路复用介质的逻辑连接。物理传输介质是指能够传播能量波的材料物质,例如数据通信中的导线。并且逻辑连接通常指电路交换连接或分组模式虚拟电路连接,例如无线电信通道。由于通信信道的帮助,信息可以无障碍地传输。

    展开全文
  • 其中包含了通信需要的程序,还有详细的原理图,对没有基础的学者学习使用
  • 串行通信作为计算机通信方式之一,主要起到主机与外设以及主机之间的数据传输作用,串行通信具有传输线少、成本低的特点,适用于近距离的人-机交换、实时监控等系统。通信工作当中,借助于现有的电话网也能实现远...

    计算机的通信方式

    了解计算机的通信方式,可以更好的帮助我们理解网络是如何交互的,我们知道计算机的两种基本通信方式是串行通信和并行通信。

    串行通信指在计算机总线或其他数据通百道上,每次传输一个位元数据,并连续进行以上单次过程的通信方式。串行通信被用于长距离通信以及大多数计算机网络。主要起到主机与外设以及主机之间的数据传输作用,串行通信具有传输线少、成本低的特点,适用于近距离的人-机交换、实时监控等系统。
    通信工作当中,借助于现有的电话网也能实现远距离传输,因此串行通信接口是计算机系统当中的常用接口,是一种通信双方按位进行,遵守时序的一种通信方式。

    并行通信是在串行端口上通过一次同时传输若干位元数据的方式进行通信。多比特数度据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。

    串行和并行的区别
    1、发送数据数量不同:串行通信用一根线在不同的时刻发送8位数据;并行通信在同一时刻发送多位数据。
    2、传输距离不同:串行通信传输距离远、占用资源少,并行通信则传输距离较短

    3、速度不同:串行通信发送速度慢,并行通信发送速度快,占用资源多。

    通信模式

    我们在串行通信中,数据通常是在两个站(如终端和微机)之间进行传送,按照数据流的方向可分成三种基本的传送方式:单工通信和双工通信中的全双工、半双工。

    通信的种类说明
    单工通信(Simplex)类似于电视、广播中电磁波信号的传输,一般为固定发送方(电视台、广播站)与固定接收方(接收天线)之间的通信方式,也称为单向通信
    双工通信(Duplex)通信的过程中没有明确的发送方和接收方,双方能够互换角色的通信方式

    双工通信:

    通信的种类说明
    半双工通信(Half-duplex)类似于无线对讲机的通信方式,通信的一方在说话时(信号发送时),另一方不能说话(A→B且B→A)
    全双工通信(Full-duplex)类似于电话的通信方式,通信的一方正在说话,另一方也可以说话(A→B或B→A)

    如图所示:
    在这里插入图片描述

    单工通信

    单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的例如广播电视就是很好的单工方式。根据收发频率的异同,单工通信可分为同频通信和异频通信。

    同频是指通信双方使用相同的工作频率。生活中使用的电台之间可直接通话,不需基站转接。通信双方的操作采用“按——讲”(PTT,Push To Talk)方式。在该方式中,电台的收发信机是交替工作的,故收发信机不需要使用天线共用器,而是使用同一副天线。平时,双方的接收机均处于守听的状态,不按键时发射机不工作,功耗小。缺点是当有两个以上移动台同时发射时就会出现同频干扰,所以只适用于组建简单和甚小容量的通信网。

    异频在无中心转信台转发的情况,电台要配对使用,否则通信双方无法通话,故异频单工方式主要用于有中心转信台转发的情况。由于收发频率有一定保护间隔,提高了抗干扰能力,中心转信台的加入使通信区域得到有效扩大,因此,这种方式常用于组建有几个频道同时工作的专用网。
    在这里插入图片描述

    半双工通信

    半双工通信也叫双向交替通信,通信的双方都可以发送信息,但双方不能同时发送或接收。它实际上可以理解为一种切换方向的单工通信。和野外探险中使用的对讲机类似,一方讲话的时候另一方不能讲话,通过开切换键可以切换改变通话方式。
    在这里插入图片描述
    这时有人肯定会像我一样疑惑,对讲机不是叫作单工机么?其实人们有时也用“单工”这个名词表示“半双工”,如常说的“单工电台”,并不是只能进行单向传送。所以这个“单工”,“半双工”,“全双工”术语的使用是非常混乱。。。害的我当时也蒙逼了好久。

    在以太网(局域网)中进行数据通信时,就使用只支持半双工的集线器进行收发数据包的操作,如果多台计算机同时发送消息,信号就会在集线器内部混杂在一起,进而无法使用,这种现象称为碰撞,是以太网的一个重要特征。

    全双工通信

    全双工通信又叫双向同时通信,通信的双方可以同时发送和接收信息。生活应用像打电话、及网络所使用的交换机(一种用于电或光信号转发的网络设备)。

    相比于半双工模式的集线器,交换机的全双工模式可以同时发送和接收信号。使用双绞线时,发送和接收的信号线是各自独立的,因此在双绞线中信号不会像集线器那样发生碰撞。如果不存在碰撞,也就不需要半双工模式的碰撞处理机制了。

    所以人们对以太网规范进行了修订,增加了一个无论网络中有没有信号都可以发送信号的工作模式,同时规定在这一工作模式下停用碰撞检测。这种工作模式就是全双工模式。在全双工模式下,无需等待其他信号结束就可以发送信号,因此它比半双工模式速度要快。由于双方可以同时发送数据,所以可同时传输的数据量更大,性能也就更高。

    若是对交换机和集线器感兴趣,想要了解的童鞋可以看看这篇文章——路由器、交换机、集线器三剑客有什么区别?分别是用来干什么的?

    展开全文
  • 简单的说: 单工通信就是只能从A到B,如[广播]半双工通信是A到B,B到A都行,但不能同时进行.如[对讲机]全双工通信是A到B,B到A都行,可以同同时进行.如[电话] ----- 详细如下: 全双工 全双工是通讯的的传输的一个...

    简单的说: 单工通信就是只能从A到B,如[广播]
    半双工通信是A到B,B到A都行,但不能同时进行.如[对讲机]
    全双工通信是A到B,B到A都行,可以同同时进行.如[电话]

    -----

    详细如下:

    全双工
      全双工是通讯的的传输的一个术语
      单工就是在同一时间只允许一方向另一方传送信息,而另一方不能向一方传送
      全双工(Full Duplex)是指在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。
      半双工(Half Duplex),所谓半双工就是指一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是基于半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台.
      全双工以太网使用两对电缆线,而不是像半双工方式那样使用一对电缆线。全双工方式在发送设备的发送方和接收设备的接收方之间采取点到点的连接,这意味着在全双工的传送方式下,可以得到更高的数据传输速度。

    半双工
      半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。例如,在一个局域网上使用具有半双工传输的技术,一个工作站可以在线上发送数据,然后立即在线上接收数据,这些数据来自数据刚刚传输的方向。像全双工传输一样,半双工包含一个双向线路(线路可以在两个方向上传递数据)。
      数据通信中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。
      半双工通信:半双工通信是指数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送,因此又被称为双向交替通信。若要改变传输方向,需由开关进行切换。半双工方式要求收发两端都有发送装置和接收装置。由于这种方式要频繁变换信道方向,故效率低,但可以节约传输线路。半双工方式适用于终端与终端之间的会话式通信。
       半双工即Half duplex Communication,是指在通信过程的任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在。采用半双工方式时,通信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,会产生时间延迟。收/发开关实际上是由软件控制的电子开关。
      当计算机主机用串行接口连接显示终端时,在半双工方式中,输入过程和输出过程使用同一通路。有些计算机和显示终端之间采用半双工方式工作,这时,从键盘打入的字符在发送到主机的同时就被送到终端上显示出来,而不是用回送的办法,所以避免了接收过程和发送过程同时进行的情况。

    单工
      单工、半双工、全双工
      如果甲可以向乙发送数据,但是乙不能向甲发送数据,这样的通信就是单工通信(Simplex Communication)。
      单工数据传输只支持数据在一个方向上传输,就和传呼机一样;
      半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,就和对讲机(步话机)一样;
      全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,就和电话一样。

    -------

    概念:

    什么是单工?
    如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。单工通信多用于无线广播、有线广播和电视广播,在局域网中并不采用。

    什么是半双工?
    若使用同一根传输线既作接收又作发送,虽然数据可以在两个方向上传递,但通信双方不能同时收发数据。这样的传送方式就是半双工制,采用半双工方式时,通信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,会产生时间延迟。收/发开关实际上是由软件控制的电子开关。

    当计算机主机用串行接口连接显示终端时,在半双工方式中,输入过程和输出过程使用同一通路。有些计算机和显示终端之间采用半双工方式工作。这时,从键盘打入的字符在发送到主机的同时就被送到终端上显示出来,而不是用回送的办法,避免了接收过程和发送过程同时进行的情况。

    目前多数终端和串行接口都为半双工方式提供了换向能力,也为全双工方式提供了两条独立的引脚。在实际使用时,一般并不需要通信双方同时既发送又接收,像打印机这类的单向传送设备,半双工甚至单工就能胜任,无需倒向。
    什么是全双工?
    数据的发送和接收分流,分别由两根不同的传输线传送时,通信双方都能在同一时刻进行发送和接收操作,这样的传送方式就是全双工制。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此它能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,没有切换操作所产生的时间延迟,达对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。这种方式要求通讯双方均有发送器和接收器,同时,需要2根数据线传送数据信号。

    网络类型   理论速度  实际利用率  实际最大传输速度  
    10Mb/s 共享  10  50  5.0  
    10Mb/s 交换  10  85  8.5  
    10Mb/s 交换式全双工  10  190  19  
    100Mb/s 交换  100  50  50  
    100Mb/s 交换  100  85  85  
    100Mb/s 交换式全双工  100  190  190  


    比如,计算机主机用串行接口连接显示终端,而显示终端带有键盘。这样,一方面键盘上输入的字符送到主机内存,另_方面,主机内存的信息可以送到屏幕显示。通常,往键盘上打入1个字符以后,先不显示,计算机主机收到字符后,立即回送到终端,然后终端再把这个字符显示出来。这样,前一个字符的回送过程和后一个字符的输入过程是同时进行的,即工作于全双工方式。

    转载于:https://www.cnblogs.com/kungfupanda/archive/2009/12/22/1629972.html

    展开全文
  • stm32---RS485半双工通信

    千次阅读 2019-08-13 15:01:00
    典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而 RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆 线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样...
  • 前言须知     本文章假定读者已经熟悉单片机串口基本使用,若您对...大四寒假制作毕业设计,考虑到通信距离问题,于是买了一对sx1278模块(正点原子的),等读了相关的文档后才发现这种模块只...
  • 在实际操作中,对于半双工通信(一问一答),如果需要一次发送多个指令,用DataReceived事件判断是否接收完毕,再发送下一条数据,不是很好的选择。 个人采用如下的方式,总的来说就是发送指令之后,用循环判断是否...
  • ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力 ... 单工通信 概念:只能从一边到另一边的通信,一边是发送端,另一边是接收端,不可逆,通道是...半双工通信 概念:...
  • 半双工通信

    千次阅读 2013-05-19 14:03:06
    半双工通信系统的通信控制协议设计  计算机网络中首先要解决的就是计算机之间的通信问题。通信控制协议为连接不同操作系统和不同硬件体系结构的互联网络提供通信支持,是一种网络通用语言。在许多控制系统中需要一...
  • 学习通信的时候,这几个名词单工通信/半双工通信/全双工通信,串行传输/并行传输,同步传输/异步传输我一直都很迷,现在我总结一下,也是加深我的记忆了 1.按照信息在信道中的传输方向分为: a.单工通信: 消息只能...
  • 无线半双工通信系统的设计
  • 电信设备-基于兰姆波的半双工通信装置及其通信方法.zip
  • Arduino HardwareSerial 库的修改,用于与 AVR 中的内置 UART 执行半双工通信。 用法: #include void setup() { // you have to manually set the TX and RX lines of your chosen serial port to INPUT_PULL...
  • Socket是client进行在网络与server进行数据交互的一种基本通信方式。通信有三种通信。...而半双工就是一来一回的通信方式,如对讲机。 全双工也是最经常使用的,就是现实长连接实时通信。如QQ。 假设理解...
  • linux管道通信 半双工通信

    千次阅读 2017-09-28 10:04:32
    在windows里进程间的通信主要用到是的消息,而在Linux里管道通信是一个不错的选择。总是觉得在Linux里编程总是让人感觉一目了然。不像在windows里,用个变量的类型都要想变天。 管道分两处,有名的和无名的,无名...
  • RS-232/RS-485转换器依托RS-232电平与TTL电平间转换,TTL电平与RS-485...采用单稳态触发器实现对数据收发状态以及通信时间的控制,可以支持多种传输速率下的通信。实际应用表明,该转换器电路工作稳定,传输数据可靠准确。
  • 非常完整的MAX485两单片机半双工通信(含程序和电路图)
  • 电信设备-半双工通信系统免提模式.zip
  • 基于MAX485两个单片机半双工通信,内部附有C语言源代码,采用KEIL进行程序仿真,内部有PROTEUS硬件仿真图。
  • 电信设备-半双工通信环境中的事件通知.zip
  • 电信设备-半双工通信系统中的碰撞避免.zip
  • 电信设备-频分双工系统中的半双工通信.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,259
精华内容 11,703
关键字:

半双工通信