树莓派与主机之间的Socket通信

前言

在做项目的过程中,需要用树莓派与PC机做的控制中心进行Socket通信
树莓派上的程序是Python的,PC机上的程序有Python和C两个版本
树莓派上运行Client端程序,PC机上运行Server端程序

一、树莓派端(Client)

由于树莓派还连接着Arduino串口,所以里面也有和串口通信的代码,懒得删了

import socket
import time
import sys
import serial

SERVER_IP = "192.168.1.102"     #服务器的IP地址
SERVER_PORT = 8888    #端口号
ser = serial.Serial("/dev/ttyUSB1",115200,timeout=1)   #串口通信的东西  

print("Starting socket: TCP...")
server_addr = (SERVER_IP, SERVER_PORT)
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

while True:    #将Client端连接到Server端上
    try:
        print("Connecting to server @ %s:%d..." %(SERVER_IP, SERVER_PORT))
        socket_tcp.connect(server_addr)
        break
    except Exception:
        print("Can't connect to server,try it latter!")
        time.sleep(1)
        continue

while True:
    command = socket_tcp.recv(512)
    if len(command)>0:
        print("Received: %s" % command)
        ser.write(command)
        time.sleep(0.1)

    response=ser.readall()
    while(len(response) < 3):
        response=ser.readall()
        time.sleep(0.1)
    print (response)
    socket_tcp.send(response)
        
    #time.sleep(1)

二、PC端(Server)

1.Python版本

2.C版本

比较简略,当作每一步都正常进行,没有异常处理


#include <stdio.h> 
#include <winsock2.h>
#include <string>
using namespace std;
#pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll

const int PORT = 8888;

int main()
{

	WSAData wsd;   // 一种用于初始启动信息的数据结构,加载winsocket.dll
	WSAStartup(MAKEWORD(2, 2), &wsd);    // 初始启动信息(加载版本号,模块)
	 //创建Socket, 使用 IPv4 进行通信(Windows只有AF_INET)、流式套接字、TCP协议
	SOCKET ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	SOCKADDR_IN ListenAddr;
	ListenAddr.sin_family = AF_INET;
	ListenAddr.sin_addr.s_addr = INADDR_ANY;  //表示填入本机ip
	ListenAddr.sin_port = htons(PORT);
	int n;
	bind(ServerSocket, (LPSOCKADDR)&ListenAddr, sizeof(ListenAddr));
	cout << "端口绑定成功:" << PORT << endl;
	listen(ServerSocket, 20);
	cout << "服务端准备就绪,等待连接请求" << endl;
	
    SOCKET* ClientSocket = new SOCKET;
	ClientSocket = (SOCKET*)malloc(sizeof(SOCKET));
	//接收客户端连接请求
	int SockAddrlen = sizeof(sockaddr);
	*ClientSocket = accept(ServerSocket, 0, 0);
	cout << "一个客户端已连接到服务器,socket是:" << *ClientSocket << endl;

    char RecvBuf[50];
	char SendBuf[50];
    cout << "请输入一个命令,例如m:";
	gets_s(SendBuf);
	send(*ClientSocket, SendBuf, 50, 0);
	cout << endl;

	recv(*ClientSocket, RecvBuf, 50, NULL);
	cout << "Receive response: " << RecvBuf << endl << endl;

	closesocket(ServerSocket);
	WSACleanup();
	return(0);
}
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值