西安在线网站邯郸网站设计公司排名

当前位置: 首页 > news >正文

西安在线网站,邯郸网站设计公司排名,电商首页设计规范,包头公司一、语音控制 1、指令结构体编写 这个结构体定义了一个命令输入的模型。在这个模型中#xff0c;包含以下几个部分#xff1a; cmdName#xff1a;一个长度为128的字符串#xff0c;用于存储命令名称。dvicesName#xff1a;一个长度为128的字符串#xff0c;用于存储设…一、语音控制 1、指令结构体编写 这个结构体定义了一个命令输入的模型。在这个模型中包含以下几个部分 cmdName一个长度为128的字符串用于存储命令名称。dvicesName一个长度为128的字符串用于存储设备名称。cmd一个长度为32的字符串用于存储具体的命令。Init一个函数指针该函数接受三个参数指向InputCmd结构体实例的指针可以读取所有字段、IP地址和端口号并返回一个整数值。getCmd一个函数指针该函数接受一个参指向InputCmd结构体实例的指针可以读取所有字段并返回一个整数值。log一个长度为1024的字符数组用于存储日志信息。fd一个整数文件描述符。next一个指向结构体本身的指针用于操控链表。 imputCmd.h #include stdio.h #include wiringPi.h #include wiringSerial.h #include unistd.h #include stdlib.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include string.hstruct InputCmd{char cmdName[128];char devicesName[128];char cmd[32];int (*Init)(struct InputCmd *cmd,char *ipAdress,char *port);int (*getCmd)(struct InputCmd *cdm);char *log[1024];int fd;char port[12];char ipAddress[32];int s_fd;struct InputCmd *next; }; 2、实例化对象 1结构体变量初始化 一个结构体变量初始化的例子声明并初始化了一个InputCmd类型的变量voice并将每个字段分别赋值。 cmdName字段被赋值为字符串voice。devicesName字段被赋值为字符串/dev/ttyAMA0。cmd字段被赋值为空字符串。init字段被赋值为voice_init函数的地址。getCmd字段被赋值为voice_getCmd函数的地址。log字段被赋值为空字符串。 2对应字段函数编写 初始化串口获取文件描述符 fdserialOpen(voice-devicesName,9600)它将尝试以9600波特率打开名为 voice-devicesName 的串行端口并将返回的文件描述符File Descriptor赋值给变量 fd。这里的 voice-devicesName 是指向一个字符串的指针该字符串包含要打开的串行端口的名称或路径。例如在Linux系统上这可能是类似于 /dev/ttyS0 或 /dev/ttyUSB0 的设备文件路径。 9600 是波特率它决定了数据传输的速度表示每秒传输9600个数据位。如果 serialOpen 函数成功打开串行端口它将返回一个非负整数。如果打开失败函数通常会返回 -1。 读取指令 从voicer-fd指向的串行端口读取数据并将这些数据存储在voicer-command缓冲区中。 插入链表等待被调用 Voice.c #include inputCmd.hint voice_init(struct InputCmd *voice,char *ipAdress,char *port){int fd;if((fdserialOpen(voice-devicesName,9600))-1){exit(-1);}voice-fdfd;return fd; }int voice_getCmd(struct InputCmd voice){int nread0;nreadread(voice-fd,voice-cmd,sizeof(voice-cmd));if(nread0){printf(usart for voice read over time\n);}elsereturn nread; }struct InputCmd voice{.cmdNamevoice,.devicesName/dev/ttyAMA0,.cmd{\0},.Initvoice_init,.getCmdvoice_getCmd,.log{\0} };struct InputCmd addVoiceToInputCmdLink(struct InputCmd *phead){if(pheadNULL){return voice;}else{voice.nextphead;pheadvoice;} } 3、将插入链表函数加入inputCmd.h等待被调用 4、main函数编写 插入链表等待被调用 mainPro.c #include stdio.h #include string.h#include controlDevices.h #include inputCmd.hstruct Devices *findDevicesName(char *name,struct Devices *phead){struct Devices *tmpphead;if(pheadNULL){return NULL;}else{while(tmp!NULL){if(strcmp(tmp-devicesName,name)0){return tmp;}tmptmp-next;}return NULL;} }int main(){if(wiringPiSetup()-1){return -1;}struct Devices *pdevicesHeadNULL;struct InputCmd *pinputCmdHeadNULL;pdevicesHeadaddbathroomLightToDevicesLink(pdevicesHead);pdevicesHeadaddupstairLightToDevicesLink(pdevicesHead);pdevicesHeadaddlivingroomLightToDevicesLink(pdevicesHead);pdevicesHeadaddrestaurantLightToDevicesLink(pdevicesHead);pdevicesHeadaddFireToDevicesLink(pdevicesHead);pinputCmdHeadaddVoiceToInputCmdLink(pinputCmdHead);char name[128]{\0};struct Devices *tmpNULL;while(1){printf(INPUT:\n);scanf(%s,name);tmpfindDevicesName(name,pdevicesHead);if(tmp!NULL){tmp-devicesInit(tmp-pinNum);tmp-open(tmp-pinNum); tmp-readStatus(tmp-pinNum);}}return 0 } 二、网络控制 1、结构体变量初始化 2、对应字段函数编写 1socket_Init 1、创建一个服务器端的套接字并初始化服务器地址结构 定义两个socket描述符变量s_fd 为服务端socket描述符c_fd 为客户端socket描述符。定义两个sockaddr_in 结构体变量s_addr 存储服务器端网络地址信息c_addr 存储客户端网络地址信息。使用 memset() 函数清零这两个结构体变量确保它们的所有成员初始化为0。创建服务器端socket 调用 socket() 函数创建一个基于IPv4协议的流式TCPsocket。如果返回值 s_fd 为-1则表示socket创建失败程序通过 perror(socket) 输出错误信息并使用 exit(-1) 终止程序执行。 初始化服务器地址结构体 s_addr.sin_family AF_INET设置地址族为InternetIPv4。 s_addr.sin_port htons(atoi(socketInit-port)): 将字符串形式的端口号转换为整型数字然后使用 htons() 函数将端口号从主机字节序转换为网络字节序。 inet_aton(socketInit-ipaddress, s_addr.sin_addr): 将字符串形式的IP地址转换为二进制格式并存入到s_addr.sin_addr中。这样就完成了服务器地址的配置接下来可以调用bind()函数绑定这个地址和端口到刚创建的socket上。(需要包含头文件#include arpa/inet.h 2、将创建的socket与特定的IP地址和端口号绑定 s_fd 是之前通过 socket() 函数创建的socket描述符。(struct sockaddr *)s_addr 指向已经初始化好的服务器地址结构体 s_addr。由于 bind() 函数的第二个参数要求指向一个通用套接字地址结构struct sockaddr *所以我们需要类型转换。 如果 bind() 调用成功那么该socket就会监听指定的IP地址和端口上的连接请求。如果失败则会返回一个错误码通常需要通过 perror() 或检查 errno 来获取错误信息并进行相应的处理。 3、 将socket设置为监听模式 s_fd 是之前创建并绑定到特定IP地址和端口的socket描述符。第二个参数这里是10表示backlog即在服务器开始拒绝连接请求前可以排队等待处理的最大连接数。当这个数目达到后新的连接请求将会被拒绝直到服务器完成对已有连接的处理。 将已经初始化并设置为监听状态的socket描述符 s_fd 赋值给结构体 socketInit 的成员变量 s_fd 2 socket_getCmd 1、声明变量与初始化c_addr结构体 int c_fd;声明一个整型变量 c_fd用于存储接受到的客户端socket描述符。 int n_read 0;声明一个整型变量 n_read用于记录从客户端socket读取数据的数量。 struct sockaddr_in c_addr;定义一个结构体变量 c_addr用于存储客户端的网络地址信息。 memset(c_addr, 0, sizeof(struct sockaddr_in));清零 c_addr 结构体确保所有成员初始化为0。 int len sizeof(struct sockaddr_in);声明并初始化一个整型变量 len表示要获取的客户端地址结构体的大小。 2、等待并接受来自客户端的连接请求 c_fd accept(socketGet.s_fd, (struct sockaddr *)c_addr, len);使用 accept() 函数等待并接受来自客户端的连接请求。 第一个参数是服务端监听的socket描述符即之前创建并调用 listen() 的 s_fd。第二个参数是一个指向 sockaddr_in 结构体的指针用于接收已连接客户端的地址信息。第三个参数是一个指向整数的指针用于接收实际填充到地址结构体中的字节数。 3、从已连接的客户端socket (c_fd) 读取数据 n_read read(c_fd, socketGet-command, sizeof(socket_command));使用 read() 函数从已连接的客户端socket (c_fd) 读取数据并将数据存入 socketGet 结构体中 command 成员指定的缓冲区。第二个参数是缓冲区的起始地址第三个参数是期望读取的最大字节数。 对于 read() 函数的返回值进行判断 如果 n_read -1说明读取过程中发生错误通过 perror(read) 输出错误信息。如果 n_read 0则打印出读取到的数据长度。如果 n_read 0通常意味着客户端已经关闭了连接此时输出 client quit!然后可能执行相应的退出循环操作这里没有显示完整的上下文所以无法确定是否有break语句所在的循环。 最后返回 n_read代表本次从客户端读取数据的实际字节数。 3插入链表等待被调用 socket.c #include inputCmd.hint socket_init(struct InputCmd *socketInit,char *ipAdress,char *port){int s_fd,c_fd;//s_fd:服务(service)端socket描述符;c_fd:客户(client)端socket描述符struct sockaddr_in s_addr;//s_addr:存储服务器端网络地址信息struct sockaddr_in c_addr;//c_addr:存储客户端网络地址信息memset(s_addr,0,sizeof(struct sockaddr_in));//初始化结构体memset(c_addr,0,sizeof(struct sockaddr_in));//sockets_fdsocket(AF_INET,SOCK_STREAM,0);if(s_fd-1){perror(socket);exit(-1);}s_addr.sin_familyAF_INET;s_addr.sin_porthtons(atoi(socketInit-port));inet_aton(socketInit-ipAddress,s_addr.sin_addr);//bindbind(s_fd,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in));//listenlisten(s_fd,10);socketInit-s_fds_fd;return s_fd; }int socket_getCmd(struct InputCmd *Socket){int c_fd;int n_read0;struct sockaddr_in c_addr;memset(c_addr,0,sizeof(struct sockaddr_in));int lensizeof(struct sockaddr_in);c_fdaccept(Socket-s_fd,(struct sockaddr )c_addr,len);n_readread(c_fd,Socket-cmd,sizeof(Socket-cmd));if(n_read-1){perror(read);}else if(n_read0){printf(\n);printf(get:%d\n,n_read);}else{printf(client quit!\n);}return n_read; }struct InputCmd Socket{.cmdNamesocket,.cmd{\0},.Initsocket_init,.getCmdsocket_getCmd,.log{\0},.port8080,.ipAddress172.20.10.9 };struct InputCmd addSocketToInputCmdLink(struct InputCmd *phead){if(pheadNULL){return Socket;}else{Socket.nextphead;pheadSocket;} }3、将插入链表函数加入inputCmd.h等待被调用 #include stdio.h #include wiringPi.h #include wiringSerial.h #include unistd.h #include stdlib.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include string.hstruct InputCmd{char cmdName[128];char devicesName[128];char cmd[32];int (*Init)(struct InputCmd *cmd,char *ipAdress,char *port);int (*getCmd)(struct InputCmd *cdm);char *log[1024];int fd;char port[12];char ipAddress[32];int s_fd;struct InputCmd next; };struct InputCmd addVoiceToInputCmdLink(struct InputCmd phead); struct InputCmd addSocketToInputCmdLink(struct InputCmd *phead); 4、main函数编写 mainPro.c #include stdio.h #include string.h#include controlDevices.h #include inputCmd.hstruct Devices *findDevicesName(char *name,struct Devices *phead){struct Devices *tmpphead;if(pheadNULL){return NULL;}else{while(tmp!NULL){if(strcmp(tmp-devicesName,name)0){return tmp;}tmptmp-next;}return NULL;} }int main(){if(wiringPiSetup()-1){return -1;}struct Devices *pdevicesHeadNULL;struct InputCmd *pinputCmdHeadNULL;pdevicesHeadaddbathroomLightToDevicesLink(pdevicesHead);pdevicesHeadaddupstairLightToDevicesLink(pdevicesHead);pdevicesHeadaddlivingroomLightToDevicesLink(pdevicesHead);pdevicesHeadaddrestaurantLightToDevicesLink(pdevicesHead);pdevicesHeadaddFireToDevicesLink(pdevicesHead);pinputCmdHeadaddVoiceToInputCmdLink(pinputCmdHead);pinputCmdHeadaddSocketToInputCmdLink(pinputCmdHead);char name[128]{\0};struct Devices *tmpNULL;while(1){printf(INPUT:\n);scanf(%s,name);tmpfindDevicesName(name,pdevicesHead);if(tmp!NULL){tmp-devicesInit(tmp-pinNum);tmp-open(tmp-pinNum); tmp-readStatus(tmp-pinNum);}}return 0; }三、测试 将工程放入树莓派中编译通过无错误无警告 四、当前阶段源代码 链接https://pan.baidu.com/s/1vh8smf725jrxSUlDOHFOfg 提取码sail