精华内容
下载资源
问答
  • 双机通信

    2020-04-29 13:22:55
    #include <STC89C5xRC.H> #define RELOAD_COUNT 0xF9 //宏定义波特率发生器的载入值 4800 void UartInit(void) //9600bps@12.000MHz { SCON|=0X50; //设置为工作方式1 TMOD|=0X20; //设置计数器工作...
    #include <STC89C5xRC.H>
    #define RELOAD_COUNT 0xF9 //宏定义波特率发生器的载入值 4800
    void UartInit(void)		//9600bps@12.000MHz
    {
    	SCON|=0X50;			//设置为工作方式1
    	TMOD|=0X20;			//设置计数器工作方式2
    	PCON=0X80;			//波特率加倍
    	TH1=RELOAD_COUNT;	//计数器初始值设置
    	TL1=TH1;
    	EA=1;				//打开总中断
    	TR1=1;				//打开计数器
    	ES=1;          //打开接收中断                       
    }
    void Delay100ms()		//@12.000MHz
    {
    	unsigned char i, j;
    
    	i = 195;
    	j = 138;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    void Unit() interrupt 4//接收中断
    {
    	int receivedata=SBUF;//储存初值
    	receivedata%=10;
    	if(receivedata==0) P2=0xff;
    	else{
    	if(((~P2)&((1<<(receivedata-1))))&(1<<(receivedata-1))) P2|=(1<<(receivedata-1));//输入的值对应的灯已经亮起时,熄灭它
    	else P2&=~(1<<(receivedata-1));}//输入的值对应的灯未亮起时,点亮它
    	RI=0;//标志位清零
    }
    void main()
    {
    	int num;
      UartInit();
    	while(1)
    	{
    		P1=0xf0;
    		if(P1!=0xf0)
    		{
    			if(P1==0x70) num=1;
    			if(P1==0xb0) num=5;
    			if(P1==0xd0) num=9;
    			if(P1==0xe0) num=13;
    			P1=0x0f;
    			if(P1==0x07) num+=0;
    			if(P1==0x0b) num+=1;
    			if(P1==0x0d) num+=2;
    			if(P1==0x0e) num+=3;
    			while(P1!=0x0f);
    			Delay100ms();//延时消抖
    			SBUF=num;//发送数据
    			while(TI==0);//延时处理
    			TI=0;
    		}
    	}
    }
    
    展开全文
  • 双机通信程序.rar

    2020-06-18 18:29:47
    双机通信程序
  • 双机通信.zip

    2019-05-15 16:28:08
    双机通信,本端CPU发送字符给对端CPU,对端接收后再发给本端,并在与本端相连的液晶屏LM041L上显示。
  • 绍了双机通信的可能性的实现方法及源程序
  • 8051双机通信简例

    2016-01-04 10:24:13
    proteus仿真及汇编代码8051双机通信简例
  • 关于51单片机双机通信1、主机发送数据,从机接收数据,双方发送和接收数据采用查询方式;2、双机开始通信,主机发送握手信号,等待从机应答;3、从机接收到握手信号后,应答OK或BUSY;4、当从机应答OK后,主机开始向...
  • 本文基于单片机的双机通信设计,给出了具体的实验原理图和程序清单。
  • 使用pic单片机,用Proteus仿真模拟双机通信,里面有设计要求和proteus运行文件。有兴趣的同学可以下载学习一下
  • 双机通信实验

    2012-11-19 14:29:05
    包括北理工信息安全对抗课程双机通信实验所有内容,如课件、客户端服务端代码。
  • 信息网络 双机通信 C++代码
  • 4、掌握Proteus仿真软件中双机通信电路的画法和实际硬件电路的注意事项。二,本次实践任务 如后图所示,实现编程将主机数据传输到从机中并显示;利用K1作为主机发送启动按钮。 具体工作方式可在串行口方式一、二、...

    一,初学者的要求

    1、掌握51单片机串行口的结构和工作特点。

    2、掌握双机串行通信时主、从机的区别与联系。

    3、熟练掌握串行中断服务程序的设计方法及技巧。

    4、掌握Proteus仿真软件中双机通信电路的画法和实际硬件电路的注意事项。

    二,本次实践任务

    如后图所示,实现编程将主机数据传输到从机中并显示;利用K1作为主机发送启动按钮。

    具体工作方式可在串行口方式一、二、三中灵活选择,例程为方式一实现。

    e595dd120b4517166a1d29946e815a48.png

    三,程序代码(分两部分)

    1. 主机代码
    #include  #define uchar unsigned char #define uint unsigned int sbit DUAN=P2^6;sbit WEI=P2^7;sbit K1=P3^4;/*¶¨ÒåÆô¶¯°´¼üK1*/uchar j=0;uchar data led[6]={1,2,3,4,5,6};uchar data ledwei[6]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar data displaytab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay()  /*ÑÓʱº¯Êý,Ô¼1mS*/{uchar x,y;for(x=2; x>0; x--)for(y=250; y>0; y--);}void delay10ms() /*ÑÓʱº¯Êý,Ô¼10mS*/{uchar m,n;for(m=20; m>0; m--)for(n=250; n>0; n--);}void display(){uchar i;for (i=0;i<6;i++){P0=displaytab[led[i]];DUAN=1;DUAN=0;P0=ledwei[i]; WEI = 1;WEI = 0;delay();P0=0xff;/*ÏûÓ°*/ WEI = 1;WEI = 0;}}void main(){TMOD=0x06; //0000 0110,T0¹¤×÷ÔÚ·½Ê½¶þ,¼ÆÊýģʽTH0=0xff; //³õֵΪÁÙ½çÖµ£¬T0×÷ΪÖ÷»úÆô¶¯°´¼ü TL0=0xff;TR0=1;EA=1;ET0=1;PS=1;while(1){display();}}void t0() interrupt 1 {delay10ms(); /*ÆÕͨÏû¶¶Ç°²¿*/if(K1==0){TMOD=0x26; //0010 0110,T0ÑÓÐøÖ÷º¯ÊýÖй¦ÄÜ£¨T0¹¤×÷ÔÚ¼ÆÊýģʽ£¬·½Ê½¶þ£¬³õֵΪÁÙ½çÖµ£¬×÷ΪÖ÷»úÆô¶¯°´¼ü£© //´ËʱT1¹¦ÄÜ,·½Ê½¶þ,×÷Ϊ²¨ÌØÂÊ·¢ÉúÆ÷£¬²Î¼ûP197-198˵Ã÷SCON=0x50; //0101 0000,´®¿Ú¹¤×÷ÔÚ·½Ê½Ò»,ÔÊÐí½ÓÊÕTH1=0xff; //12MHz¾§Õñ,²¨ÌØÂÊ62.5kb/s TL1=0xff; //³õÖµ¿É²Î¼û¿Î±¾P198±í8-2PCON=0x80; //1000 0000£¬²¨ÌØÂʱ¶ÔöÓÐЧTR1=1;ES=1; SBUF=led[j];}while(!K1); /*ÆÕͨÏû¶¶ºó²¿*/delay10ms();while(!K1);}void uart() interrupt 4{if(j<6){j++;SBUF=led[j];}else{j=0;} TI=0; /*Çå´®Ðз¢ËÍÖжÏÇëÇó±êÖ¾TI*/} 
    23ea50a52f021d8fffe9ee836480ab96.png
    b553390b82561326d528be9a032a2274.png
    78e2125bdd8fdaf4c65abda57f8de1b4.png
    50f16a6faa4c7b68c3d7b0aa013a3d05.png
    e3aa8ea248b6843e210043f3d4b6146c.png
    04d6f21ad285ba748d53f939cf232cc2.png
    089021cac6d95d256ef8a394d238a931.png
    ef0a7d069bccc989a401f667c7a36154.png

    2.从机代码

    #include  #define uchar unsigned char #define uint unsigned int sbit DUAN=P2^6;sbit WEI=P2^7;uchar j=0;uchar data led[6]={0,0,0,0,0,0};uchar data ledwei[6]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar data displaytab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay()  /*ÑÓʱº¯Êý,Ô¼1mS*/{uchar x,y;for(x=2; x>0; x--)for(y=250; y>0; y--);}void display(){uchar i;for (i=0;i<6;i++){P0=displaytab[led[i]];DUAN=1;DUAN=0;P0=ledwei[i]; WEI = 1;WEI = 0;delay();P0=0xff;/*ÏûÓ°*/ WEI = 1;WEI = 0;}}void main(){ TMOD=0x20;//´ËʱT1¹¦ÄÜ,·½Ê½¶þ,×÷Ϊ²¨ÌØÂÊ·¢ÉúÆ÷£¬²Î¼ûP197-198˵Ã÷SCON=0x50;//0101 0000,´®¿Ú¹¤×÷ÔÚ·½Ê½Ò»,ÔÊÐí½ÓÊÕTH1=0xff;//12MHz¾§Õñ,²¨ÌØÂÊ62.5kb/s TL1=0xff;//³õÖµ¿É²Î¼û¿Î±¾P198±í8-2PCON=0x80;//1000 0000£¬²¨ÌØÂʱ¶ÔöÓÐЧTR1=1;ES=1;EA=1;while(1){display();}}void uart() interrupt 4{if(j<6){led[j]=SBUF;j++;}else{j=0;} RI=0;/*Çå´®ÐнÓÊÕÖжÏÇëÇó±êÖ¾RI*/} 

    四,仿真结果

    注意:利用K1作为主机发送启动按钮

    e1e6551ee897522b5c5afe35d68da57f.png
    展开全文
  • 电子-CAN双机通信.zip

    2019-09-05 11:38:37
    电子-CAN双机通信.zip,单片机/嵌入式STM32-F0/F1/F2
  • 本文给出AVR单片机SPI双机通信的程序源码,感兴趣的朋友可以看看。
  • 基于双机通信的银行叫号系统,使用蓝牙通信,包含万年历,时间,温度显示,矩阵键盘输入,语音播报。资料包含源程序,使用的模块及淘宝链接,操作演示视频,焊接成品照片,及设计报告。
  • 实验七 双机通信

    千次阅读 2019-01-18 11:03:17
    实验七 双机通信 一、实验要求 在两个单片机上实现串行通信,将一块单片机上的按键信息发送到另一块单片机上用八个数码管动态显示出键值。 二、实验目的 1.学习双机通信的基本使用方法。 2.学习双机通信程序的...

    实验七  双机通信

    一、实验要求

    在两个单片机上实现串行通信,将一块单片机上的按键信息发送到另一块单片机上用八个数码管动态显示出键值。

    、实验目的

    1.学习双机通信的基本使用方法。

    2.学习双机通信程序的编程方法

    、实验原理

    89C51单片机片内有一个可编程的全双工的异步通信串行口。所谓全双工就是两个单片机之间串行数据可同时双向传输。异步传输,就是收、发双方使用各自的时钟控制发送和接受过程。89C51的串行口有四种工作方式,波特率可通过软件设置片内的定时器/计数器来控制。每当串行口接收或发送一个字节完毕,均可发出中断请求。而在串行通信中,收、发双方发送或接收的波特率必须一致。

    、实验内容

    本次实验的实验内容为串口双机通信,可以完成的功能:在一方的矩形键盘按下一个值,在另一方的数码管上动态显示。矩阵键盘采用4×4式,其中前十个键为0-9数字,后六个键为A-F字母。A-F代表着不同的波特率,通过按下不同的键,可以设置不同的波特率。A-137.5b/s,B-1.2kb/s,C-2.4kb/s,D-4.8kb/s,E-9.6kb/s,F-19.2kb/s.获取键值的方式为:扫描法。

    、实验程序框图

    ‪C:\Users\WYP\Desktop\1.JPG

    ‪C:\Users\WYP\Desktop\2.JPG

    、实验电路图

    、实验程序

    发送方:

     

    ORG 0000H

    LJMP MAIN

    ORG 1000H

    MAIN:MOV SP,#60H

    MOV TMOD,#20H      

    MOV TH1,#1DH      

    MOV TL1,#1DH

    SETB TR1

    MOV SCON,#40H    

    LOP1:MOV P2,#0F0H  

    MOV A,P2           

    ANL A,#0F0H       

    MOV B,A           

    XRL A,#0F0H     

    JZ LOP1           

    LCALL Delay       

    MOV A,P2          

    ANL A,#0F0H     

    CJNE A,B,LOP1     

    LCALL SCAN           

    LCALL LOOSE     

    LCALL GET_KEY    

    AJMP LOP1            

    SCAN:MOV R3,#0    

    MOV R2,#0FEH       

    SCAN2:MOV A,R2

    MOV P2,A         

    MOV A,P2         

    JB ACC.4,LOOP1   

    MOV R4,#0       

    RET

    LOOP1:JB ACC.5,LOOP2

    MOV R4,#04H      

    RET

    LOOP2:JB ACC.6,LOOP3

    MOV R4,#08H     

    RET

    LOOP3:JB ACC.7,SCAN1

    MOV R4,#0CH      

    RET

    SCAN1:INC R3    

    MOV A,R2

    RL A

    MOV R2,A

    JB ACC.4,SCAN2   

    RET

    LOOSE:MOV P2,#0F0H  

    MOV A,P2

    ANL A,#0F0H

    XRL A,#0F0H

    JNZ LOOSE

    RET

    GET_KEY: MOV A,R4

    ADD A,R3        

    MOV B,A         

    MOV DPTR,#TAB   

    MOVC A,@A+DPTR

    MOV SBUF,A          

    JNB TI,$        

    CLR TI           

    MOV A,B         

    CJNE A,#0AH,GET0   

    MOV TL1,#1DH

    MOV TH1,#1DH

    AJMP GET5

    GET0:CJNE A,#0BH,GET1   

    MOV TL1,#0E8H

    MOV TH1,#0E8H

    AJMP GET5

    GET1:CJNE A,#0CH,GET2  

    MOV TL1,#0F4H

    MOV TH1,#0F4H

    AJMP GET5

    GET2:CJNE A,#0DH,GET3

    MOV TL1,#0FAH

    MOV TH1,#0FAH

    AJMP GET5

    GET3:CJNE A,#0EH,GET4  

    MOV TL1,#0FDH

    MOV TH1,#0FDH

    AJMP GET5

    GET4:CJNE A,#0FH,GET5  

    MOV PCON,#80H

    MOV TL1,#0FDH

    MOV TH1,#0FDH

    GET5:RET

    Delay:MOV R2,#20

    DEY1:MOV R3,#248

    NOP

    DJNZ R3,$

    DJNZ R2,DEY1

    RET

    SJMP $

    TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H

    END

     

    接受方:

     

    ORG 0000H

    LJMP MAIN

    ORG 0023H

    LJMP REXE       

    ORG 1000H

    MAIN:MOV SP,#60H

    MOV TMOD,#20H    

    MOV TH1,#1DH      

    MOV TL1,#1DH

    MOV SCON,#50H    

    SETB TR1

    SETB ES

    SETB EA

    MOV R6,#7      

    MOV 30H,#77H     

    MOV R1,#31H        

    DISP:MOV P1,#00H   

    MOV P2,30H         

    LCALL Delay       

    MOV P1,#01H     

    MOV P2,31H

    LCALL Delay

    MOV P1,#02H     

    MOV P2,32H

    LCALL Delay

    MOV P1,#03H     

    MOV P2,33H

    LCALL Delay

    MOV P1,#04H     

    MOV P2,34H

    LCALL Delay

    MOV P1,#05H     

    MOV P2,35H

    LCALL Delay

    MOV P1,#06H     

    MOV P2,36H

    LCALL Delay

    MOV P1,#07H      

    MOV P2,37H

    LCALL Delay

    AJMP DISP        

    REXE:CLR RI         

    MOV A,SBUF        

    LCALL Option   

    MOV @R1,A      

    INC R1         

    DJNZ R6,REC    

    MOV R1,#31H        

    MOV R6,#7

    REC:RETI

    Delay: MOV R2,#10

    DEY1:MOV R3,#248

    NOP

    DJNZ R3,$

    DJNZ R2,DEY1

    RET

    Option:CJNE A,#77H,Opt0

    MOV TL1,#1DH        

    MOV TH1,#1DH

    ACALL Rest             

    AJMP Opt5

    Opt0:CJNE A,#7CH,Opt1

    MOV TL1,#0E8H       

    MOV TH1,#0E8H

    ACALL Rest          

    AJMP Opt5

    Opt1:CJNE A,#39H,Opt2

    MOV TL1,#0F4H

    MOV TH1,#0F4H

    ACALL Rest

    AJMP Opt5

    Opt2:CJNE A,#5EH,Opt3

    MOV TL1,#0FAH

    MOV TH1,#0FAH

    ACALL Rest

    AJMP Opt5

    Opt3:CJNE A,#79H,Opt4

    MOV TL1,#0FDH

    MOV TH1,#0FDH

    ACALL Rest

    AJMP Opt5

    Opt4:CJNE A,#71H,Opt5

    MOV PCON,#80H

    MOV TL1,#0FDH

    MOV TH1,#0FDH

    ACALL Rest

    Opt5:RET

    Rest:MOV 30H,A   

    MOV 31H,#0        

    MOV 32H,#0

    MOV 33H,#0

    MOV 34H,#0        

    MOV 35H,#0

    MOV 36H,#0

    MOV 37H,#0

    MOV R1,#30H        

    MOV R6,#1      

    RET

    END

     

    八、实验总结

    通过在两个单片机上实现串行通信,将一块单片机上的按键信息发送到另一块单片机上用八个数码管动态显示出键值。我们学习了双机通信的基本使用方法并且学习了双机通信程序的编程方法。

     

    展开全文
  • 这是一个STM32F103基于HAL库的CAN双机通信测试程序,分享给大家进行学习,实验。
  • 讨论了网络传真协议栈,并根据双网数字传真机的总体设计方案,完成了其软硬件模块设计,实现了其双机通信模块的软硬件,并在仿真环境下完成了调测试。  0 引言  传真通信不仅能传送图像/ 图形信息,而且可以保留...
  • 本文主要讲了51单片机双机通信硬件电路图及C程序,下面以来学习一下
  • 针对弧光保护系统的实际需要,设计了一种基于SPI的双机通信系统。简要阐述了该系统的设计思路,并给出了具体的实现方法。实验表明,采用该方法能够满足实际工程中的需求,对于其他SPI的应用也有很好的借鉴价值。
  • 单片机IO模拟串口,半双工双机通信,仿真文件,代码包,确保可用。仿真文件通信波特率为9600 8 n 1,格式。别的波特率也可以修改延时函数来支持。对于串口资源紧张的小封装单片机特别适用。
  • 1.1 利用Socket实现双机通信

    千次阅读 2020-03-29 17:29:46
    利用Socket实现双机通信目的环境所需知识实验分析实验结果代码 目的 利用WinSock来实现双机通信,理解TCP状态图 要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。 环境 Windows10操作系统、...

    目的

    1. 利用WinSock来实现双机通信,理解TCP状态图
    2. 要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。

    环境

    1. Windows10操作系统、DevC++
    2. 对于使用MinGW的devc++,是没有ws2_32.lib这个库文件,它对应的库文件是libws2_32.a;可以在项目属性里的链接器添加这个库文件,或者在 工具->编译选项->在连接器命令行加入以下命令 中,删除原有命令,添加 -lws2_32 命令。

    所需知识

    1. 计算机网络通讯
      (1)实质:进程之间的通讯
      (2)两台计算机之间通讯的基础:主机唯一标识符(IP)、进程唯一标识符(PORT)
    2. Socket简介
      (1)Socket是支持TCP/IP 协议的网络通信的基本单元
      (2)Socket包含5种信息:连接使用的协议,本机IP,本机PORT,远地主机IP,远地主机PORT。
      (3)Socket如何标识唯一进程的:通过IP地址标识网络中的唯一主机,通过传输层协议+PORT唯一标识主机中的进程。
      (4)Socket在网络结构中的位置:位于传输层与应用层之间。本质是一个编程接口,封装传输层为应用层提供服务。
      socket
      (5)Socket架构:C/S架构,典型的客户端、服务端架构。提供数据的传输服务。
    3. windows socket函数详解

    (1)函数库头文件

    #include <WinSock2.h> 
    #pragma comment(lib,"Ws2_32.lib ")
    

    (2)WSAStartup 初始化Ws2_32.dll的函数

    int WSAStartup(__in WORD wVersionRequested,  __out LPWSADATA lpWSAData);
    //WSAStartup 函数用于初始化供进程调用的Winsock相关的dll。
    //wVersionRequested标识了用户调用的Winsock的版本号。通常使用MAKEWORD来生成一个版本号,现在一般为2。
    //lpWSAData指向WSADATA结构体的指针,lpWSAData返回了系统对Windows Sockets 的描述。
    //如果调用成功,WSAStartup 函数返回0。否则,将返回五种错误代码之一。但绝对不能使用WSAGetLastError获取错误代码。
    

    (3)WSACleanup 释放Ws2_32.dll的函数

    int WSACleanup(void);
    //该函数释放对Winsock链接库的调用。
    

    (4)socket 创建socket的函数

    SOCKET WSAAPI socket( __in int af, __in int type,__in int protocol);
    //socket函数将创建指定传输服务的socket。
    //af:指明地址簇类型,常用的地址簇如下,其余地址簇在Winsock2.h中定义AF_INET(IPv4)、AF_INET6(IPv6)。
    //type:指明socket的类型,常见类型:SOCK_STREAM(流套接字,使用TCP协议)、SOCK_DGRAM(数据报套接字,使用UDP协议)、SOCK_RAW(原始套接字)
    //protocol:指明数据传输协议,该参数取决于af和type参数的类型。
    //如果不出错,socket函数将返回socket的描述符(句柄),否则,将返回INVALID_SOCKET。
    

    (5)bind 服务端将socket与地址关联

    int bind( __in SOCKET s, __in const struct sockaddr* name, __in int namelen); 
    //bind函数将socket关联一个本地地址。
    //s:指定一个未绑定的socket。
    //name:指向sockaddr地址的指针,该结构含有IP和PORT
    //namelen:参数name的字节数。
    //无错误返回0,有错误返回SOCKET_ERROR。
    

    (6)listen 服务端网络监听

    int listen( __in SOCKET s, __in int backlog );
    //s:socket描述符,该socket是一个未连接状态的socket
    //backlog:挂起连接的最大长度,如果该值设置为SOMAXCONN,负责socket的底部服务提供商将设置该值为最大合理值。并没有该值的明确规定。
    //没有错误发生将返回0,否则返回SOCKET_ERROR 
    

    (7) accept服务端connect接收

    SOCKET accept(__in SOCKET s,__out struct sockaddr* addr, __in_out int* addrlen );
    //accept函数将创建连接。
    //s:listen函数用到的socket。
    //addr:指向通信层连接实体地址的指针。addr 的格式取决于bind函数内地址簇的类型。
    //addrlen:addr的长度
    //如果不发生错误,accept将返回一个新的SOCKET描述符,即新建连接的socket句柄。否则,将返回INVALID_SOCKET。
    //传进去的addrlen应该是参数addr的长度,返回的addrlen是实际长度。
    

    (8)connect客户端请求服务端连接

    int connect( __in SOCKET s,__in const struct sockaddr* name,__in int namelen );
    //s:一个没有完成连接的socket;
    //name:指向sockaddr地址的指针,该结构含有IP和PORT;
    //namelen:参数name的字节数;
    //返回0表示正确,否则,将返回SOCKET_ERROR。如果是阻塞式的socket连接,返回值代表了连接正常与失败。
    

    (9)send、recv发送接收数据

    int send(__in SOCKET s,__in const char* buf,__in int len,__in int flags );
    int recv(__in SOCKET s,__out char* buf, __in int len, __in int flags );
    //s:socket
    //buf:数据buffer
    //len:待发送/接收数据的长度
    //flags:send(recv)函数的发送(接收)数据方式。
    //send的返回值标识已发送数据的长度,这个值可能比参数len小,这也意味着数据缓冲区没有全部发出去,要进行后续处理。返回SOCKET_ERROR标识send出错。
    //recv的返回值标识已接收数据的长度。如果连接已关闭,返回值将是0。返回SOCKET_ERROR标识recv出错。
    

    (10)closesocket关闭socket

    closesocket(__in SOCKET s);
    //如果无错误发生,函数返回0。否则,返回SOCKET_ERROR。
    
    1. socket tcp建立连接,关闭连接以及点对点通讯
      (1)建立连接(三次握手)
      connect
      (2)关闭连接
      close
      (3)点对点通信
      sendRecv

    实验分析

    双机通信可以通过一台计算机上运行服务端,一台计算机上运行客户端,通过服务端与客户端通信来实现双机通信。
    (1)客户端
    客户端需要先初始化Ws2_32.dll的函数,然后建立socket,通过connect()函数与服务端建立连接,如果连接建立成功,客户端需要建立一个用于发送信息的线程来向服务端保证能够随时发送数据,在主线程中需要一直对服务端发送来的信息保持接收。
    p1
    (2)服务端
    服务端要一直等待客户端的连接请求,接受请求后,连接建成,则服务端建立一个线程用于随时向服务端发送数据,同时在主线程中还要一直对客户端发来的信息保持接收。
    等待客户请求:
    p2

    实验结果

    首先运行服务端,然后运行客户端,在客户端指定好要连接的服务端的IP地址和端口号则可以与对应服务端连接,然后就可以进行通讯了。
    下面中展示的是在我自己电脑上建立了一个服务端一个客户端,它们两个间进行通讯,实际上如果服务端与客户端分别运行在两台电脑上,它们也能成功实现通讯。
    result

    代码

    服务器端

    #include <WinSock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h> 
    #pragma comment(lib, "ws2_32.lib")
    #include<iostream>
    using namespace std;
    void* recv1(SOCKET sockConn)
    {  
        char recvBuf[10000];
        memset(recvBuf, 0, sizeof(recvBuf));
        //接收数据
        while(true){
            int nRecv = ::recv(sockConn, recvBuf, sizeof(recvBuf), 0);
            cout<<endl;
            if(nRecv>0){
    			cout<<"server receive:"<<recvBuf<<endl;
            }
    		else break;
    	}
    }
    void* send1(void* args)
    {
        SOCKET sockClient1 = *( (SOCKET*)args );//建立套接字
        while(true){
            char buff1[10000];
            cin>>buff1;
            if(buff1 == ""){
    	      break;
            }
            int e = send(sockClient1, buff1, sizeof(buff1), 0);
            if(e == SOCKET_ERROR){
                printf("send failed");
                break;
            }
            cout<<"server send:"<<buff1<<endl;
       }
    }
    int main()
    {
        WSADATA wsaData;
        int port = 5099;
    
        char buf[] = "Server: hello, I am a server.....";
    
        if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //加载套接字库
        {
            printf("Failed to load Winsock");
            return 0;
        }
    
        //创建用于监听的套接字
        SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    
        SOCKADDR_IN addrSrv;
        addrSrv.sin_family = AF_INET;//IPV4
        addrSrv.sin_port = htons(port); //1024以上的端口号
        addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //INADDR_ANY 代表任意ip,htonl():将主机字节顺序从u_long转换为网络字节 
    
        int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));
        if(retVal == SOCKET_ERROR){
            printf("Failed bind:%d\n", WSAGetLastError());
            return 0;
        }
    
        if(listen(sockSrv,10) ==SOCKET_ERROR){//10代表允许连接的个数
            printf("Listen failed:%d", WSAGetLastError());
            return 0;
        }
    
        SOCKADDR_IN addrClient;
        int len = sizeof(SOCKADDR);
    
        while(true)
        {
            //等待客户请求到来
            SOCKET sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);
            if(sockConn == SOCKET_ERROR){
                printf("Accept failed:%d", WSAGetLastError());
                break;
            }
            printf("Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr));
            //发送数据
            int iSend = send(sockConn, buf, sizeof(buf) , 0);
            if(iSend == SOCKET_ERROR){
                printf("send failed");
                break;
            }
            pthread_t tids[2];
            int ret = pthread_create( &tids[0], NULL, send1, (void*)&sockConn ); 
            if( ret != 0 ) //创建线程成功返回0
            {
                cout << "pthread_create error:error_code=" << ret << endl;
            }
            recv1(sockConn);
            closesocket(sockConn);
        }
    
        closesocket(sockSrv);
        WSACleanup();
        system("pause");
    }
    

    客户端:

    #include <WinSock2.h>
    #include <stdio.h> 
    #include <pthread.h>
    #pragma comment(lib, "ws2_32.lib")
    #include<iostream>
    using namespace std;
    void* recv1(SOCKET sockConn)
    {  
        char recvBuf[10000];
        memset(recvBuf, 0, sizeof(recvBuf));//每个字节都用0填充 
        //接收数据
        while(true){
            int nRecv = ::recv(sockConn, recvBuf, sizeof(recvBuf), 0);
            if(nRecv>0){
    	  		cout<<"client receive:"<<recvBuf<<endl;
    	  	} 
            else break;
        }
    }
    void* send1(void* args)
    {
        SOCKET sockClient1 = *( (SOCKET*)args );
        while(true){
        	char buff1[10000];
        	cin>>buff1;
        	if(buff1 == ""){
    		    break;
        	}
        	int e = send(sockClient1, buff1, sizeof(buff1), 0);
            if(e == SOCKET_ERROR){
                printf("send failed");
                break;
            }
            cout <<"client send:"<<buff1<<endl;
        }
        
    }
    int main()
    {
        //加载套接字
        WSADATA wsaData;
        char buff[1024];
        memset(buff, 0, sizeof(buff));
    
        if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)//初始化DDL 
        {
            printf("Failed to load Winsock");
            return 0;
        }
    
        SOCKADDR_IN addrSrv; //服务端地址
        addrSrv.sin_family = AF_INET;//IPV4 
        addrSrv.sin_port = htons(5099);//port 
        addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//serverIP地址,inet_addr将点分十进制地址转换为无符号4字节的整数地址
    
        //创建客户端套接字
        SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);//创建指定传输服务的socket,流步套接字
        if(SOCKET_ERROR == sockClient){
            printf("Socket() error:%d", WSAGetLastError());
            return 0;
        }
    
        //向服务器发出连接请求
        if(connect(sockClient, (struct  sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){
            printf("Connect failed:%d", WSAGetLastError());
            return 0;
        }else{    
    	    pthread_t tids[2];
            int ret = pthread_create( &tids[0], NULL, send1, (void*)&sockClient ); 
            if( ret != 0 ) //创建线程成功返回0
            {
               cout << "pthread_create error:error_code=" << ret << endl;
            }
            //接收数据
            recv(sockClient, buff, sizeof(buff), 0);
            printf("%s\n", buff);
        }
        recv1(sockClient);
        //send1((void*)&sockClient);
        //关闭套接字
        closesocket(sockClient);
        WSACleanup();
    }
    
    展开全文
  • C语言单片机双机通信

    2011-04-11 10:37:29
    一个简单的实现双机通信的程序,发送的数据与接受数据时候均有显示(通过LED的方式)
  • 单片机双机通信的例子,通过232,来实现,我是用反正来组破的
  • 用两块单片机做双机通信一块做主机一块做从机,当主机发送时从机接收到主机发过来的数据并显示,同理从机发时主机接收并显示数据一直循环,这个程序是学习双机通信的好例子特别适合初学者
  • 通过51单片机实现双机通信, 内含protues仿真图和keil代码,方便大家学习!
  • 利用C51单片机模拟SPI进行双机通信

    千次阅读 2019-03-18 21:53:32
    C51模拟SPI进行双机通信
  • stm32f103 nrf24l01+实现双机通信
  • 单片的双机通信

    千次阅读 2014-07-20 23:23:12
    通常单片机的双机通信有以下4中方式tong'xing

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 548
精华内容 219
关键字:

双机通信