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

微信公众号h5商城网站开发个人网站如何搭建

微信公众号h5商城网站开发,个人网站如何搭建,软件小程序开发公司,网站开发具备的相关知识OpenMV与STM32的通信是嵌入式系统和物联网领域中的一项重要技术。OpenMV是一种开源的微型机器视觉模块#xff0c;基于ARM Cortex-M7微控制器#xff0c;支持多种图像处理功能#xff0c;如颜色识别、形状检测等。而STM32是STMicroelectronics公司推出的基于ARM Cortex内核的…OpenMV与STM32的通信是嵌入式系统和物联网领域中的一项重要技术。OpenMV是一种开源的微型机器视觉模块基于ARM Cortex-M7微控制器支持多种图像处理功能如颜色识别、形状检测等。而STM32是STMicroelectronics公司推出的基于ARM Cortex内核的32位微控制器系列具有高性能、低功耗和丰富的外设接口。 在OpenMV与STM32之间建立通信常用的方式包括UART通用异步收发传输器、SPI串行外设接口和I2C两线式串行总线等。这些通信协议各有特点如UART适合长距离通信SPI和I2C则更适合短距离通信。在选择通信协议时需要考虑数据传输速率、硬件资源、通信距离以及复杂度等因素。 实现OpenMV与STM32的通信需要在硬件上进行引脚连接确保双方的工作电压一致并正确连接TX发送和RX接收引脚。在软件方面需要分别在OpenMV和STM32上配置相应的通信接口参数如波特率、数据位、停止位等以确保双方能够正确地进行数据传输。 通过OpenMV与STM32的通信可以实现图像数据的实时传输和处理为嵌入式系统和物联网应用提供了强大的机器视觉功能。这种通信方式在智能小车、机器人、无人机等领域具有广泛的应用前景。 OpenMV与STM32之间的通信通常通过串行通信接口如UART、SPI或I2C来实现。这些接口允许两个设备之间以数字信号的形式交换数据。以下是OpenMV与STM32通信的几种常见方法 1. UART通用异步收发传输器 UART是最常用的串行通信接口之一它不需要时钟同步信号而是使用起始位、数据位、校验位和停止位来标记数据的开始和结束。 硬件连接将OpenMV的TX发送引脚连接到STM32的RX接收引脚同时将OpenMV的RX接收引脚连接到STM32的TX发送引脚。确保两个设备的GND地线也连接在一起。 软件配置在OpenMV上使用pyb.UART()函数来初始化串口。在STM32上使用STM32CubeMX或手动配置USART外设并编写代码来初始化串口。 数据通信在OpenMV上使用uart.send()或uart.write()函数发送数据。在STM32上使用中断或轮询方式接收数据并使用HAL_UART_Receive()等函数读取数据。 2. SPI串行外设接口 SPI是一种同步串行通信协议它使用主从设备架构其中一个设备作为主机通常是STM32其他设备作为从机如OpenMV但需要注意OpenMV的SPI支持情况。 硬件连接连接MOSI主出从入、MISO主入从出、SCK时钟和CS片选引脚。确保GND也连接在一起。 软件配置在OpenMV上如果支持SPI则使用pyb.SPI()函数来初始化SPI接口。在STM32上使用STM32CubeMX或手动配置SPI外设。 数据通信在OpenMV上使用spi.send()和spi.recv()等函数进行数据传输。在STM32上使用HAL_SPI_Transmit()和HAL_SPI_Receive()等函数进行数据传输。 注意OpenMV的SPI支持可能因版本和硬件配置而异因此在使用前需要查阅OpenMV的官方文档以确认其SPI功能。 3. I2C总线 I2C也是一种同步串行通信协议它使用两根线SDA数据线和SCL时钟线进行数据传输。与SPI相比I2C支持多个从设备连接到一个主设备。 硬件连接连接SDA和SCL引脚以及GND。 软件配置在OpenMV上如果支持I2C则使用pyb.I2C()函数来初始化I2C接口。在STM32上使用STM32CubeMX或手动配置I2C外设。 数据通信在OpenMV上使用i2c.send()和i2c.recv()等函数进行数据传输。在STM32上使用HAL_I2C_Master_Transmit()和HAL_I2C_Master_Receive()等函数进行数据传输。 注意同样地OpenMV的I2C支持也可能因版本和硬件配置而异。 总结 在选择通信接口时需要考虑数据传输速率、设备数量、硬件资源和软件复杂度等因素。UART通常是最简单且最常用的选择而SPI和I2C则适用于需要更高数据传输速率或需要连接多个从设备的场景。在编写代码时务必确保两个设备的通信参数如波特率、数据位、停止位、校验位等一致以避免通信错误。 通信原理 1、通信基础 通信方式OpenMV与STM32之间的通信主要通过串口UART实现这是一种异步通信方式不需要时钟同步信号而是直接在数据信号中穿插一些用于同步的信号位或者以数据帧的格式传输数据。 硬件连接在硬件连接上OpenMV的TX发送引脚连接到STM32的RX接收引脚同时OpenMV的RX接收引脚连接到STM32的TX发送引脚。通常OpenMV的UART引脚为P4TX和P5RX而STM32的UART引脚则根据具体型号有所不同如STM32F103系列的USART1通常使用PA9TX和PA10RX。此外还需要确保OpenMV和STM32的电源和地线正确连接以保证稳定的电源供应和信号传输。2、通信过程 初始化在通信开始前需要在OpenMV和STM32上分别进行初始化设置。在OpenMV端需要编写Python代码来配置串口包括设置波特率、数据位、停止位和校验位等参数。在STM32端则需要使用STM32CubeMX或手动配置时钟和GPIO引脚并编写代码来初始化串口确保与OpenMV的串口配置一致。 数据发送在OpenMV端可以通过串口发送数据。数据可以包括图像识别结果如目标坐标、大小等。发送数据前需要编写函数来打包需要发送的数据并通过串口发送。数据打包时可以使用特定的字节作为帧头和帧尾以确保数据传输的准确性和可靠性。 数据接收在STM32端需要编写接收中断服务函数来读取接收到的数据并根据数据帧格式进行解析。接收数据时STM32需要不断地检查串口接收缓冲区当接收到完整的数据帧时进行解析并提取出有效数据。如果数据帧不完整或格式错误则需要丢弃当前数据帧并等待下一个数据帧的到来。一、串口通信传输两个数据x坐标和y坐标  一、 OPENMV串口通信部分 import sensor, image, time,math,pyb from pyb import UART,LED import json import ustructsensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time 2000) sensor.set_auto_gain(False) # must be turned off for color tracking sensor.set_auto_whitebal(False) # must be turned off for color tracking red_threshold_01(10, 100, 127, 32, -43, 67) clock time.clock()uart UART(3,115200) #定义串口3变量 uart.init(115200, bits8, parityNone, stop1) # init with given parametersdef find_max(blobs): #定义寻找色块面积最大的函数max_size0for blob in blobs:if blob.pixels() max_size:max_blobblobmax_size blob.pixels()return max_blobdef sending_data(cx,cy,cw,ch):global uart;#frame[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];#data bytearray(frame)data ustruct.pack(bbhhhhb, #格式为俩个字符俩个短整型(2字节)0x2C, #帧头10x12, #帧头2int(cx), # up sample by 4 #数据1int(cy), # up sample by 4 #数据2int(cw), # up sample by 4 #数据1int(ch), # up sample by 4 #数据20x5B)uart.write(data); #必须要传入一个字节数组while(True):clock.tick()img sensor.snapshot()blobs img.find_blobs([red_threshold_01])max_b find_max(blobs)cx0;cy0;if blobs:#如果找到了目标颜色cxmax_b[5]cymax_b[6]cwmax_b[2]chmax_b[3]img.draw_rectangle(max_b[0:4]) # rectimg.draw_cross(max_b[5], max_b[6]) # cx, cyFH bytearray([0x2C,0x12,cx,cy,cw,ch,0x5B])#sending_data(cx,cy,cw,ch)uart.write(FH)print(cx,cy,cw,ch)在这里插入代码片STM32端的代码相对复杂涉及到硬件抽象层HAL或标准外设库SPL的使用以及串口中断服务函数的编写。基本思路是初始化串口编写接收中断服务函数来读取数据并根据数据帧格式进行解析和处理。 接下来请看STM32串口通信部分的代码 #include uart.h #include oled.h #include stdio.hstatic u8 Cx0,Cy0,Cw0,Ch0;void USART1_Init(void) {//USART1_TX:PA 9 //USART1_RX:PA10GPIO_InitTypeDef GPIO_InitStructure; //串口端口配置结构体变量USART_InitTypeDef USART_InitStructure; //串口参数配置结构体变量NVIC_InitTypeDef NVIC_InitStructure; //串口中断配置结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开PA端口时钟//USART1_TX PA9GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; //PA9GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //设定IO口的输出速度为50MHzGPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, GPIO_InitStructure); //初始化PA9//USART1_RX PA10GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; //PA10GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA, GPIO_InitStructure); //初始化PA10 //USART1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0 ; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority 2; //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //IRQ通道使能NVIC_Init(NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate 115200; //串口波特率为115200USART_InitStructure.USART_WordLength USART_WordLength_8b; //字长为8位数据格式USART_InitStructure.USART_StopBits USART_StopBits_1; //一个停止位USART_InitStructure.USART_Parity USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; //无硬件数据流控制USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART1, USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能中断USART_Cmd(USART1, ENABLE); //使能串口1//如下语句解决第1个字节无法正确发送出去的问题USART_ClearFlag(USART1, USART_FLAG_TC); //清串口1发送标志}//USART1 全局中断服务函数 void USART1_IRQHandler(void) {u8 com_data; u8 i;static u8 RxCounter10;static u16 RxBuffer1[10]{0};static u8 RxState 0; static u8 RxFlag1 0;if( USART_GetITStatus(USART1,USART_IT_RXNE)!RESET) //接收中断 {USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志com_data USART_ReceiveData(USART1);if(RxState0com_data0x2C) //0x2c帧头{RxState1;RxBuffer1[RxCounter1]com_data;OLED_Refresh();}else if(RxState1com_data0x12) //0x12帧头{RxState2;RxBuffer1[RxCounter1]com_data;}else if(RxState2){RxBuffer1[RxCounter1]com_data;if(RxCounter110||com_data 0x5B) //RxBuffer1接受满了,接收数据结束{RxState3;RxFlag11;CxRxBuffer1[RxCounter1-5];CyRxBuffer1[RxCounter1-4];CwRxBuffer1[RxCounter1-3];ChRxBuffer1[RxCounter1-2];}}else if(RxState3) //检测是否接受到结束标志{if(RxBuffer1[RxCounter1-1] 0x5B){USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断if(RxFlag1){OLED_Refresh();OLED_ShowNum(0, 0,Cx,3,16,1);OLED_ShowNum(0,17,Cy,3,16,1);OLED_ShowNum(0,33,Cw,3,16,1);OLED_ShowNum(0,49,Ch,3,16,1);}RxFlag1 0;RxCounter1 0;RxState 0;USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);}else //接收错误{RxState 0;RxCounter10;for(i0;i10;i){RxBuffer1[i]0x00; //将存放数据数组清零}}} else //接收异常{RxState 0;RxCounter10;for(i0;i10;i){RxBuffer1[i]0x00; //将存放数据数组清零}}}}一OPENMV串口部分 from machine import Pin import sensor, image, time, pyb #import seekfree from pyb import UART# 初始化TFT180屏幕 #lcd seekfree.LCD180(3)# 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式 sensor.set_framesize(sensor.QQVGA) # 设置图像大小为160*120 sensor.set_auto_whitebal(True) # 设置自动白平衡 sensor.set_brightness(3000) # 设置亮度为3000 sensor.skip_frames(time 20) # 跳过帧 uart UART(3, 115200,timeout_char3000) #配置串口 clock time.clock()def sending_data(cx,cy,cw,ch):global uart;data ustruct.pack(bbhhb, #格式为俩个字符俩个短整型(2字节)0x2C, #帧头10x12, #帧头2int (cx1), # up sample by 4 #数据26int (cy1),int (cx2), # up sample by 4 #数据26int (cy2),int (cx3), # up sample by 4 #数据26int (cy3),int (cx4), # up sample by 4 #数据26int (cy4),0x5B)uart.write(data); #必须要传入一个字节数组while(True):clock.tick()img sensor.snapshot()# -----矩形框部分-----# 在图像中寻找矩形for r in img.find_rects(threshold 10000):# 判断矩形边长是否符合要求if r.w() 20 and r.h() 20:# 在屏幕上框出矩形img.draw_rectangle(r.rect(), color (255, 0, 0), scale 4)# 获取矩形角点位置corner r.corners()# 在屏幕上圈出矩形角点img.draw_circle(corner[0][0], corner[0][1], 5, color (0, 0, 255), thickness 2, fill False)img.draw_circle(corner[1][0], corner[1][1], 5, color (0, 0, 255), thickness 2, fill False)img.draw_circle(corner[2][0], corner[2][1], 5, color (0, 0, 255), thickness 2, fill False)img.draw_circle(corner[3][0], corner[3][1], 5, color (0, 0, 255), thickness 2, fill False)# 打印四个角点坐标, 角点1的数组是corner[0], 坐标就是(corner[0][0],corner[0][1])# 角点检测输出的角点排序每次不一定一致矩形左上的角点有可能是corner0,1,2,3其中一个corner1_str fcorner1 ({corner[0][0]},{corner[0][1]})corner2_str fcorner2 ({corner[1][0]},{corner[1][1]})corner3_str fcorner3 ({corner[2][0]},{corner[2][1]})corner4_str fcorner4 ({corner[3][0]},{corner[3][1]})print(corner1_str \n corner2_str \n corner3_str \n corner4_str)# 显示到屏幕上此部分会降低帧率#lcd.show_image(img, 160, 120, 0, 0, zoom0) #屏幕显示#串口通信传输的数据cx1(int)(corner[0][0]*10)cy1(int)(corner[0][1]*10)cx2(int)(corner[1][0]*10)cy2(int)(corner[1][1]*10)cx3(int)(corner[2][0]*10)cy3(int)(corner[2][1]*10)cx4(int)(corner[3][0]*10)cy4(int)(corner[3][1]*10)FHbytearray([0x2C,0x12,cx1,cy1,cx2,cy2,cx3,cy3,cx4,cy4,0x5B])uart.write(FH)cx10cy10cx20cy20cx30cy30cx40cy40# 打印帧率print(clock.fps())STM32串口通信部分 #include stm32f10x.h // Device header #include stdio.h #include stdarg.h #include OLED.h #include LED.h #include Serial.huint8_t Serial_RxData; uint8_t Serial_RxFlag; static int16_t Cx10,Cy10,Cx20,Cy20,Cx30,Cy30,Cx40,Cy40; int Cx5[16];//用于存放分段求的坐标值 int Cy5[16]; //static u8 RxFlag1 0;//串口中断接收标志位extern float Ang1,Ang2,AngFlag; extern float Angle1,Angle2;int avel_X1 ; int avel_X2 ; int avel_X3 ; int avel_X4 ;int avel_Y1 ; int avel_Y2 ; int avel_Y3 ; int avel_Y4 ;void Serial_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//TXGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStructure);//RXGPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate 115200;USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx;USART_InitStructure.USART_Parity USART_Parity_No;USART_InitStructure.USART_StopBits USART_StopBits_1;USART_InitStructure.USART_WordLength USART_WordLength_8b;USART_Init(USART3, USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;NVIC_Init(NVIC_InitStructure);USART_Cmd(USART3, ENABLE); }void Serial_SendByte(uint8_t Byte) {USART_SendData(USART3, Byte);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) RESET); }void Serial_SendArray(uint8_t *Array, uint16_t Length) {uint16_t i;for (i 0; i Length; i ){Serial_SendByte(Array[i]);} }void Serial_SendString(char *String) {uint8_t i;for (i 0; String[i] ! \0; i ){Serial_SendByte(String[i]);} }uint32_t Serial_Pow(uint32_t X, uint32_t Y) {uint32_t Result 1;while (Y --){Result * X;}return Result; }void Serial_SendNumber(uint32_t Number, uint8_t Length) {uint8_t i;for (i 0; i Length; i ){Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 0);} }int fputc(int ch, FILE *f) {Serial_SendByte(ch);return ch; }void Serial_Printf(char *format, ...) {char String[100];va_list arg;va_start(arg, format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String); } //USART3 全局中断服务函数 void USART3_IRQHandler(void) {int com_data; u8 i;u8 Jieshou 1;static u8 RxCounter10;static int RxBuffer1[16]{0};static u8 RxState 0; static u8 RxFlag1 0;//串口中断接收标志位已被移除至函数体外作为全局变量if( USART_GetITStatus(USART3,USART_IT_RXNE)!RESET Jieshou 1) //接收中断 { // OLED_ShowSignedNum(1,1,520,4);USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清除中断标志com_data USART_ReceiveData(USART3);if(Jieshou 1){if(RxState0com_data0x2C) //0x2c帧头{RxBuffer1[RxCounter1]com_data;RxState1;}else if(RxState1com_data0x12) //0x12帧头{RxBuffer1[RxCounter1]com_data;RxState2;} else if(RxState2){RxBuffer1[RxCounter1]com_data;if(RxCounter114||com_data 0x5B) //RxBuffer1接受满了,接收数据结束{RxState3;RxFlag11;Jieshou 2;Cx1RxBuffer1[RxCounter1-9];Cy1RxBuffer1[RxCounter1-8];Cx2RxBuffer1[RxCounter1-7];Cy2RxBuffer1[RxCounter1-6];Cx3RxBuffer1[RxCounter1-5];Cy3RxBuffer1[RxCounter1-4];Cx4RxBuffer1[RxCounter1-3];Cy4RxBuffer1[RxCounter1-2];OLED_ShowSignedNum(1,1,Cx1,4);OLED_ShowSignedNum(2,1,Cy1,4);OLED_ShowSignedNum(3,1,Cx2,4);OLED_ShowSignedNum(4,1,Cy2,4);OLED_ShowSignedNum(1,7,Cx3,4);OLED_ShowSignedNum(2,7,Cy3,4);OLED_ShowSignedNum(3,7,Cx4,4);OLED_ShowSignedNum(4,7,Cy4,4);}}}else if(RxState3) //检测是否接受到结束标志{if(RxBuffer1[RxCounter1-1] 0x5B){USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断if(RxFlag1){ AngFlag0;HuanRaoZuoBiao(); // // OLED_ShowSignedNum(1,1,Cx1,4);// OLED_ShowSignedNum(2,1,Cx2,4); // OLED_ShowSignedNum(3,1,avel_X1,4); // OLED_ShowSignedNum(4,1,Cx5[0],4);AngFlag1;RxFlag1 0;RxCounter1 0;RxState 0; }USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); }else //接收错误{RxState 0;RxCounter10;for(i0;i10;i){RxBuffer1[i]0x00; //将存放数据数组清零}}} else //接收异常{RxState 0;RxCounter10;for(i0;i10;i){RxBuffer1[i]0x00; //将存放数据数组清零}}}}注意事项 波特率匹配确保OpenMV和STM32的波特率设置一致否则会导致数据传输错误。 数据帧格式定义清晰的数据帧格式避免数据冲突和解析错误。数据帧通常包括帧头、数据部分和帧尾。 电源稳定性确保电源供应稳定避免因电压波动导致的通信中断。 逐步测试逐步测试每个功能模块确保OpenMV和STM32之间的通信正常数据解析正确。
http://www.w-s-a.com/news/652464/

相关文章:

  • 网站透明导航代码国外卖货平台有哪些
  • 张家界网站建设方案中国网页设计师
  • 淮南网站建设服务东莞营销型手机网站建设
  • 常德做网站专业公司河南高端网站建设
  • 网站服务器建设的三种方法会展设计ppt
  • 如何把自己做的网站放到内网seo优化网络
  • 北京网站建设net2006厦门优化公司
  • 制作网页前为什么要建立站点菏泽百度网站建设
  • 做影视网站引流网页美工设计课程教案
  • 响应式网站开发流程图网站优化seo教程
  • 做汽车团购网站百度官网平台
  • 网站增加关键字建设旅游网站的功能定位
  • 怎么搭建源码网站义乌网络
  • 定远规划建设局网站wordpress云主机安装
  • 慈溪市网站开发软件开发文档国家标准
  • 本地佛山顺德网站设计公司的网站如何建设
  • 网站建设前十名网站建设 招标书
  • 手机网站标准百度搜索关键词排名优化推广
  • 中国空间站科幻作文1000字wordpress运行库
  • 徐州做网站的wordpress可视化编辑器排行
  • 官方网站英语上海公司注册核名查询
  • 东莞网站建设推广云南昆明最新消息
  • 上网站乱码网页设计与网站建设案例教程
  • 宣讲网站建设wordpress多媒体主题
  • 如何成立网站互联网开发是做什么的
  • 网站首页的尺寸做多大网页图片排版
  • 龙岩天宫山索道多少钱河南网站排名优化哪家好
  • 北京做网站设计程序员和网站开发
  • 个人 做自媒体 建网站图片制作成视频的手机软件
  • h5 建站网站 移动端重庆潼南网站建设价格