STM32通过广和通L610进行TCP/IP通信
一、 写在前面
本次参加嵌入式大赛,使用了广和通的ADP-L610-Arduino板子进行通信。项目要求大概是本地上传数据到服务器,服务器接收后发送给客户端,实现数据的传输。在这个项目中需要用到两个客户端,所以需要实现服务端的多线程操作。多线程我具体还没整明白,这篇文章介绍的还是单线程。TCP/IP通信协议的可靠性、可操作性、安全性等几个特征,正好是我这次项目所需要的。前前后后整了两天,写下这篇博客,分享下经验的同时也为自己写下备忘录。
二、材料准备
- STM32开发板
- ADP-L610-Arduino板子
- 公网IP
【注意】:实际上不限于STM32开发板,只要能进行串口通信的板子就行。运营商通常不会提供静态公网IP,所以需要我们购买一个服务器,下面会提供阿里云ECS云服务器的简单使用方法。
三、CS架构TCP/IP通信
Socket在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为文件描述符。Socket 保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个 Socket 对象,然后通过 Socket 对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。
本示例代码的头文件是linux平台的,可以让服务端循环等待客户端连接,但目前仅支持单线程连接,多线程连接等我用上了会更新。
1.服务端server.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define PORT 8088 /*端口号*/
#define BACKLOG 1 /*最大监听数*/
int main(){
int sockfd,new_fd; /*socket句柄和建立连接后的句柄*/
struct sockaddr_in my_addr; /*本方地址信息结构体,下面有具体的属性赋值*/
struct sockaddr_in their_addr; /*对方地址信息*/
int sin_size;
int client;
sockfd=socket(AF_INET,SOCK_STREAM,0); //建立socket
if(sockfd==-1)