既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
网口通讯(Ethernet)和串口通讯(Serial)都是用于数据传输的通信协议。
1、网口通信有:TCP(可靠连接)、UDP(无连接)
(1)要设置的:IP地址+端口;
(2)通讯数据帧格式:帧头+长度+数据域+停止位
2、串口通信,是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式;
(1)串口通讯协议包含:RS232(全双工,常用)、RS485(半双工)
(2)要设置的:串口号、波特率(单设这个也行,容易出错)、奇偶校验位、停止位
(3)数据格式:由起始位(1bit)+ 数据位(8bit)+ 奇偶校验位(1bit)+ 停止位(1bit)组成;
(4)主要步骤:打开、设置、读写、关闭;
3、工具小助手:
(1)网口通信:NetAssist.exe;
(2)串口通信:UartAssist.exe
二、网口通讯与串口通讯主要区别:
-
传输速度:网口通讯速度较快,可以达到几十兆甚至几百兆的传输速度;串口通讯速度较慢,一般只能达到几千字节每秒的传输速度。
-
传输距离:网口通讯可以通过局域网或广域网进行数据传输,传输距离较远;串口通讯只能在短距离内传输数据,一般不超过几十米。
-
连接方式:网口通讯使用网线连接,需要路由器或交换机等网络设备进行连接;串口通讯使用串口连接,可以直接连接两台设备。
-
数据传输方式:网口通讯采用数据包方式进行数据传输,数据包中包含了地址、数据和校验等信息;串口通讯采用逐位传输方式进行数据传输,数据逐位传输,没有数据包的概念。
总的来说,网口通讯适合在大范围内进行数据传输,传输速度快,而串口通讯适合在短距离内进行数据传输,连接简单。在实际应用中,需要根据具体的需求选择适合的通讯方式。
三、初始化网口,实现网口通讯的步骤:(附代码)
1、网口通讯:(以TCP为例)
(1)客户端:
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
int sockfd;
struct sockaddr_in servaddr;
// 服务器地址
const char* ipaddr = "127.0.0.1";
int port = 12345;
// 创建Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(ipaddr);
servaddr.sin_port = htons(port);
// 连接服务器
if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
perror("connect");
return -1;
}
// 发送数据
const char* msg = "Hello world";
int n = write(sockfd, msg, strlen(msg));
if (n < 0) {
perror("write");
return -1;
}
// 接收数据
char buf[1024];
n = read(sockfd, buf, sizeof(buf));
if (n < 0) {
perror("read");
return -1;
}
buf[n] = '\0';
std::cout << "Received: " << buf << std::endl;
// 关闭Socket
close(sockfd);
return 0;
}
在以上示例代码中,使用了socket
函数创建了一个TCP Socket,使用connect
函数连接到服务器,使用write
函数发送数据,使用read
函数接收数据,最后使用close
函数关闭Socket。其中,sockaddr_in
结构体用于存储服务器地址信息,inet_addr
函数将IP地址转换为二进制格式,htons
函数将端口号转换为网络字节序。
(2)服务器:
//以下是一个简单的网口通讯的服务端的C++示例:
#include <iostream>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
int main(int argc, char *argv[]) {
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char *hello = "Hello from server";
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定IP和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
// 等待客户端连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 接收客户端数据
valread = read(new_socket, buffer, 1024);
printf("%s\n", buffer);
// 发送数据给客户端
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
// 关闭socket
![img](https://img-blog.csdnimg.cn/img_convert/9c9493c7ea4ab6c09156e1e383f29b52.png)
![img](https://img-blog.csdnimg.cn/img_convert/6469c94885d6ddf387c97f60d1120ff3.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
620649)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**