-
双机通信
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上显示。 -
双机通信的可能性介绍
2020-08-05 15:29:18绍了双机通信的可能性的实现方法及源程序 -
8051双机通信简例
2016-01-04 10:24:13proteus仿真及汇编代码8051双机通信简例 -
关于51单片机双机通信
2020-08-18 06:44:33关于51单片机双机通信1、主机发送数据,从机接收数据,双方发送和接收数据采用查询方式;2、双机开始通信,主机发送握手信号,等待从机应答;3、从机接收到握手信号后,应答OK或BUSY;4、当从机应答OK后,主机开始向... -
基于单片机的双机通信设计
2020-08-12 15:11:18本文基于单片机的双机通信设计,给出了具体的实验原理图和程序清单。 -
Proteus仿真 双机通信.zip
2020-05-23 11:56:35使用pic单片机,用Proteus仿真模拟双机通信,里面有设计要求和proteus运行文件。有兴趣的同学可以下载学习一下 -
双机通信实验
2012-11-19 14:29:05包括北理工信息安全对抗课程双机通信实验所有内容,如课件、客户端服务端代码。 -
信息网络 双机通信 C++代码
2017-05-11 23:12:22信息网络 双机通信 C++代码 -
单片机双机通信例题_基于51单片机的双机串行通信
2020-12-25 00:56:314、掌握Proteus仿真软件中双机通信电路的画法和实际硬件电路的注意事项。二,本次实践任务 如后图所示,实现编程将主机数据传输到从机中并显示;利用K1作为主机发送启动按钮。 具体工作方式可在串行口方式一、二、...一,初学者的要求
1、掌握51单片机串行口的结构和工作特点。
2、掌握双机串行通信时主、从机的区别与联系。
3、熟练掌握串行中断服务程序的设计方法及技巧。
4、掌握Proteus仿真软件中双机通信电路的画法和实际硬件电路的注意事项。
二,本次实践任务
如后图所示,实现编程将主机数据传输到从机中并显示;利用K1作为主机发送启动按钮。
具体工作方式可在串行口方式一、二、三中灵活选择,例程为方式一实现。
三,程序代码(分两部分)
- 主机代码
#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*/}
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作为主机发送启动按钮
-
电子-CAN双机通信.zip
2019-09-05 11:38:37电子-CAN双机通信.zip,单片机/嵌入式STM32-F0/F1/F2 -
AVR单片机SPI双机通信的程序源码
2020-07-29 06:27:55本文给出AVR单片机SPI双机通信的程序源码,感兴趣的朋友可以看看。 -
基于双机通信的银行叫号系统
2020-07-10 18:10:20基于双机通信的银行叫号系统,使用蓝牙通信,包含万年历,时间,温度显示,矩阵键盘输入,语音播报。资料包含源程序,使用的模块及淘宝链接,操作演示视频,焊接成品照片,及设计报告。 -
实验七 双机通信
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.获取键值的方式为:扫描法。
五、实验程序框图
六、实验电路图
七、实验程序
发送方:
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
八、实验总结
通过在两个单片机上实现串行通信,将一块单片机上的按键信息发送到另一块单片机上用八个数码管动态显示出键值。我们学习了双机通信的基本使用方法并且学习了双机通信程序的编程方法。
-
STM32F103CAN双机通信程序
2018-09-27 17:09:26这是一个STM32F103基于HAL库的CAN双机通信测试程序,分享给大家进行学习,实验。 -
通信与网络中的基于双机通信的研究
2020-11-03 22:35:48讨论了网络传真协议栈,并根据双网数字传真机的总体设计方案,完成了其软硬件模块设计,实现了其双机通信模块的软硬件,并在仿真环境下完成了调测试。 0 引言 传真通信不仅能传送图像/ 图形信息,而且可以保留... -
51单片机双机通信硬件电路图及C程序
2020-07-14 16:43:11本文主要讲了51单片机双机通信硬件电路图及C程序,下面以来学习一下 -
基于SPI双机通信的弧光保护系统
2020-10-17 03:05:07针对弧光保护系统的实际需要,设计了一种基于SPI的双机通信系统。简要阐述了该系统的设计思路,并给出了具体的实现方法。实验表明,采用该方法能够满足实际工程中的需求,对于其他SPI的应用也有很好的借鉴价值。 -
M48 IO 模拟串口USRT 双机通信.rar
2020-11-04 20:54:08单片机IO模拟串口,半双工双机通信,仿真文件,代码包,确保可用。仿真文件通信波特率为9600 8 n 1,格式。别的波特率也可以修改延时函数来支持。对于串口资源紧张的小封装单片机特别适用。 -
1.1 利用Socket实现双机通信
2020-03-29 17:29:46利用Socket实现双机通信目的环境所需知识实验分析实验结果代码 目的 利用WinSock来实现双机通信,理解TCP状态图 要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。 环境 Windows10操作系统、...目的
- 利用WinSock来实现双机通信,理解TCP状态图
- 要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。
环境
- Windows10操作系统、DevC++
- 对于使用MinGW的devc++,是没有ws2_32.lib这个库文件,它对应的库文件是libws2_32.a;可以在项目属性里的链接器添加这个库文件,或者在 工具->编译选项->在连接器命令行加入以下命令 中,删除原有命令,添加 -lws2_32 命令。
所需知识
- 计算机网络通讯
(1)实质:进程之间的通讯
(2)两台计算机之间通讯的基础:主机唯一标识符(IP)、进程唯一标识符(PORT) - Socket简介
(1)Socket是支持TCP/IP 协议的网络通信的基本单元
(2)Socket包含5种信息:连接使用的协议,本机IP,本机PORT,远地主机IP,远地主机PORT。
(3)Socket如何标识唯一进程的:通过IP地址标识网络中的唯一主机,通过传输层协议+PORT唯一标识主机中的进程。
(4)Socket在网络结构中的位置:位于传输层与应用层之间。本质是一个编程接口,封装传输层为应用层提供服务。
(5)Socket架构:C/S架构,典型的客户端、服务端架构。提供数据的传输服务。 - 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。
- socket tcp建立连接,关闭连接以及点对点通讯
(1)建立连接(三次握手)
(2)关闭连接
(3)点对点通信
实验分析
双机通信可以通过一台计算机上运行服务端,一台计算机上运行客户端,通过服务端与客户端通信来实现双机通信。
(1)客户端
客户端需要先初始化Ws2_32.dll的函数,然后建立socket,通过connect()函数与服务端建立连接,如果连接建立成功,客户端需要建立一个用于发送信息的线程来向服务端保证能够随时发送数据,在主线程中需要一直对服务端发送来的信息保持接收。
(2)服务端
服务端要一直等待客户端的连接请求,接受请求后,连接建成,则服务端建立一个线程用于随时向服务端发送数据,同时在主线程中还要一直对客户端发来的信息保持接收。
等待客户请求:
实验结果
首先运行服务端,然后运行客户端,在客户端指定好要连接的服务端的IP地址和端口号则可以与对应服务端连接,然后就可以进行通讯了。
下面中展示的是在我自己电脑上建立了一个服务端一个客户端,它们两个间进行通讯,实际上如果服务端与客户端分别运行在两台电脑上,它们也能成功实现通讯。
代码
服务器端
#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的方式) -
单片机双机通信的例子
2012-04-23 16:10:37单片机双机通信的例子,通过232,来实现,我是用反正来组破的 -
单片机双机通信c语言编写
2010-08-14 21:15:12用两块单片机做双机通信一块做主机一块做从机,当主机发送时从机接收到主机发过来的数据并显示,同理从机发时主机接收并显示数据一直循环,这个程序是学习双机通信的好例子特别适合初学者 -
Protues仿真实例(8051)-双机通信简例.zip
2019-07-28 20:24:34通过51单片机实现双机通信, 内含protues仿真图和keil代码,方便大家学习! -
利用C51单片机模拟SPI进行双机通信
2019-03-18 21:53:32C51模拟SPI进行双机通信 -
stm32f103 nrf24l01+实现双机通信
2015-05-11 10:02:35stm32f103 nrf24l01+实现双机通信 -
单片的双机通信
2014-07-20 23:23:12通常单片机的双机通信有以下4中方式tong'xing