cfsetispeed和cfsetospeed交换机和路由器的区别别

8633人阅读
学习《unix环境高级编程》(13)
对于波特率的设置通常使用cfsetospeed和cfsetispeed函数来完成。获取波特率信息是通过cfgetispeed和
cfgetospeed函数来完成的。
  cfsetospeed函数
  头文件:
  #include
  函数原型:
  int cfsetospeed(struct termios *termptr, speed_t speed);
  参数:
  struct termios *termptr - 指向termios结构的指针
  speed_t speed - 需要设置的输出波特率
  返回值:
  如果成功返回0,否则返回-1
  cfsetispeed函数
  头文件:
  #include
  函数原型:
  int cfsetispeed(struct termios *termptr, speed_t speed);
  struct termios *termptr - 指向termios结构的指针
  speed_t speed - 需要设置的输入波特率
  返回值:
  如果成功返回0,否则返回-1
  cfgetospeed函数
  头文件:
  #include
  函数原型:
  speed_t cfgetospeed(const struct termios *termptr);
  const struct termios - 指向termios结构的指针
  返回值:
  返回输出波特率
  cfgetispeed函数
  头文件:
  #include
  函数原型:
  speed_t cfgetispeed(const struct termios *termptr);
  const struct termios *termptr - 指向termios结构的指针
  返回值:
  返回输入波特率
  波特率常量:
  CBAUD 掩码
  B0 0波特
  B50 50波特
  B75 75波特
  B110 100波特
  B134 134波特
  B150 150波特
  B200 200波特
  B300 300波特
  B600 600波特
  B200波特
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:148249次
积分:1827
积分:1827
排名:千里之外
原创:29篇
转载:18篇
评论:78条
(2)(3)(9)(1)(4)(4)(4)(7)(4)(6)(2)(1)所属专题:&&&& 发布时间: 9:32:23
RS485/云台控制(PTZ)学习文档
一.项目任务:
在linux环境下通过RS485串口实现对云台镜头的各种控制(包括摄像头的打开,关闭,各个方向的运动及运动速度,预设点,自动扫描,变倍,调焦,光圈,视角宽窄等等的各项控制)。
二.学习步骤
1.验证串口,云台等硬件
考虑先在windows环境下运行串口调试精灵等软件,采用RS232-RS485的接口转换器将PC机与云台相连,通过串口调试精灵向云台发送命令(根据具体云台所采用的协议pelco-d或是pelco-p),验证云台能否正常工作,以保证后续工作顺利进行。
2.熟悉linux下的串口编程
串口是电脑上一种很通用设备通信的协议,常用PC机上包含的是RS232规格的串口,当然,除了RS232
,还有RS485和RS422两种规格,用于不同的设备通信;linux环境下万物皆文件,都是文档,串口是设备文档,配置好后,其他东西就当成文档进行操作。
串口编程中比较重要的是串口的设置,需要配置的部分包括波特率,数据位,停止位,奇偶校验等。关于linux下串口设置的例子和程序网上有很多,而且基本上内容大同小异。
可以采用如下方法来验证自己在linux下的串口程序:准备PC机两台(一台装Linux系统,另一台装windows即可),用串口线分别和两台计算机的串口相连,在windows机下运行串口调试软件,并打开com1(linux下对应串口ttyS0)等待操作。在linux机下运行自己的串口程序,注意打开的串口和波特率,校验位等设置要和windows机一致,可以将自己的串口程序运行在接收数据状态,并打印信息,在windows机下用串口调试精灵发送数据,验证在linux机下接受是否正确,同样可以验证发送数据是否正确。
配置波特率:注意每台机器都有输出输入接收信息的速度,所以用cfsetispeed和cfsetospeed来分别设置。Linux串口设置过程中有一个非常重要的结构体struct
,它包括了串口端的任何配置,在termios.h中被定义。系统为波特率专门准备了一张表用B3…代替。实际上传出的是3这些值。函数原型:Void
set_speed(int fd,int speed).
配置奇偶校验,数据,停止位。
这三个参数通常放在一起配置,databits是数据位,stopbits是停止位,parity是校验位。Termios成员中共定义c_cflag
控制项 c_lflag 线路项 c_iflag 输入项 c_oflag 输出项 c_cc 控制字符 c_ispeed 输入波特
c_ospeed 输出波特
那么多项,对于每一项都有很多的配置,比较复杂,但就一个通用的串口框架,主要进行奇偶校验,数据,停止位的配置。而其他的一些控制项。函数原型:
int set_Parity(int fd,int databits,int stopbits,int parity)
配置好串口后,就可以打开串口,并不断的从串口读数据,并打印出这些数据进行验证自己的程序。此部分Down了个串口程序来熟悉linux下的串口编程。
三.云台控制协议pelco-D/P
云台有水平云台,旋转云台和万向云台等多种类型,水平云台和旋转云台的运动速度是恒定的。只有上下左右四个方向,每个方向都有一个限位开头,因而每一方向行程的距离固定,而万向云台运动速度是可变的,且运动方向是任意,控制比较复杂。对与云台的工作原理和电路进行了基本了解,由于实际应用时只需通过串口向云台发送其能识别的命令来完成相应的控制即可。云台测的东西没有进一步的深入了解。
云台控制系统设计时要选协议,每个云台都有协议可以选择,要么自动识别,要么通过拨码开关来选择。具体要看设备说明书。每个厂家的拨码方式不一样。协议选好后,就可以向云台发送命令控制云台,控制云台时发送一个指令,都要在发送一个停止指令,否则云台将一直执行那一操作。查资料发现大多数云台都支持pelco-D和pelco-P协议。目前这两个协议也有很多版本,大多是扩充。
  1.该协议中所有数值都为十六进制数
  2.同步字节始终为FFH
3.地址码为摄像机的逻辑地址号,地址范围:00H–FFH可以在设备中设置。
  4.指令码表示不同的动作
  5.数据码1、2分别表示水平、垂直方向速度(00-3FH),FFH表示“turbo”速度
6.校验码 = MOD[(字节2 + 字节3 + 字节4 + 字节5 + 字节6)/100H]
命令字1和命令字2设置如下:
Sence码与Bit4和Bit3有关。在Bit4和Bit3为1的情况下,如果Sence码为1,则命令就是自动扫描和和摄像机打开;如果Sence码为0,则命令就是手动扫描和摄像机关闭。当然如果Bit4或Bit3为0的话那命令就无效了。
数据1表示镜头左右平移的速度,数值从$00(停止)到$3F(高速),另外还有一个值是$FF,表示最高速。
数据2表示镜头上下移动的速度,数值从$00(停止)到$3F(最高速)。
校验码是指Byte2到Byte6这5个数的和(若超过255则除以256然后取余数)。
Pelco-D的命令码和数据码的参考命令:
  以地址码0x01为例的部分指令:
  {0xff,0x01,0x00,0x08,0x00,0xff,0x08,}//上
  {0xff,0x01,0x00,0x10,0x00,0xff,0x10,}//下
  {0xff,0x01,0x00,0x04,0xff,0x00,0x04,}//左
  {0xff,0x01,0x00,0x02,0xff,0x00,0x02,}//右
  {0xff,0x01,0x00,0x20,0x00,0x00,0x21,}//变倍短
  {0xff,0x01,0x00,0x40,0x00,0x00,0x41,}//变倍长
  {0xff,0x01,0x00,0x80,0x00,0x00,0x81,}//聚焦近
  {0xff,0x01,0x01,0x00,0x00,0x00,0x02,}//聚焦远
  {0xff,0x01,0x02,0x00,0x00,0x00,0x03,}//光圈小
  {0xff,0x01,0x04,0x00,0x00,0x00,0x05,}//光圈大
  {0xff,0x01,0x00,0x0b,0x00,0x01,0x0d,}//灯光关
  {0xff,0x01,0x00,0x09,0x00,0x01,0x0b,}//灯光开
  {0xff,0x01,0x00,0x07,0x00,0x01,0x09,}//转至预置点001
  {0xff,0x01,0x00,0x03,0x00,0x01,0x05,}//设置预置点001
  {0xff,0x01,0x00,0x05,0x00,0x01,0x07,}//删除预置点001
  以上对应的停命令均是:
  {0xff,0x01,0x00,0x00,0x00,0x00,0x01,}//停命令
PELCO-P协议一般采用RS-485传输,波特率为4800,1位起始位和停止位,8位数据位,无校验位。格式:
停止码是固定值 $AF 。校验码是 Byte2 到 Byte6 这 5 个数的异或值(XOR)。地址码是从
0编起的,所以地址码$00表示第一台设备。
以地址码0x01为例:
{0xa0,0x01,0x00,0x08,0x00,0x30,0xaf,0x39,}//上
{0xa0,0x01,0x00,0x10,0x00,0x30,0xaf,0x21,}//下
{0xa0,0x01,0x00,0x04,0x10,0x00,0xaf,0x15,}//左
{0xa0,0x01,0x00,0x02,0x10,0x00,0xaf,0x13,}//右
{0xa0,0x01,0x00,0x40,0x00,0x00,0xaf,0x41,}//变倍短
{0xa0,0x01,0x00,0x20,0x00,0x00,0xaf,0x21,}//变倍长
{0xa0,0x01,0x02,0x00,0x00,0x00,0xaf,0x03,}//聚焦近
{0xa0,0x01,0x01,0x00,0x00,0x00,0xaf,0x00,}//聚焦远
{0xa0,0x01,0x08,0x00,0x00,0x00,0xaf,0x09,}//光圈小
{0xa0,0x01,0x04,0x00,0x00,0x00,0xaf,0x05,}//光圈大
  无命令字发送//灯光关
  无命令字发送//灯光开
{0xa0,0x01,0x00,0x96,0x00,0x20,0xaf,0xb7,}//自动巡航
{0xa0,0x01,0x00,0x99,0x00,0x20,0xaf,0xb8,}//关闭自动巡航
{0xa0,0x01,0x00,0x07,0x00,0x01,0xaf,0x07,}//转至预置点001
{0xa0,0x01,0x00,0x03,0x00,0x01,0xaf,0x03,}//设置预置点001
{0xa0,0x01,0x00,0x05,0x00,0x01,0xaf,0x01,}//删除预置点001
以上对应的停命令均是(上下左右、变倍、聚焦、光圈均有停命令):
{0xa0,0x01,0x00,0x00,0x00,0x00,0xaf,0x01,}
云台控制(PTZ)命令控制说明:
当控制云台水平、上下方向动作或“IRIS”、“FOCUS”、“ZOOM”时需要使相应的控制位为“1”,不用控制的相应位置为“0”
当需要云台PAN/TILT两方向同时动作时,只需将PAN/TILT的相应控制位置“1”即可,PAN/TILT
的速度控制由WORD5/WORD6决定
⒊将WORD3、WORD4的所有位置为“0”可以停止云台的动作
5、扩充命令
万向云台支持预设点,使云台转动到提前设置好的点。命令格式:
四.编写并调试 Linux 环境下的云台控制程序
首先在linux环境下编写简单的程序验证命令的正确性,例如利用write函数直接通过RS485向云台写命令(符合云台控制协议),查看命令是否执行正确,如果正确则编写云台控制程序将这些命令封装成函数,以供上层函数调用。
全局变量 :int ptz_protocol,
baudrate,ptz_fd云台所采用的协议和波特率,串口句柄。
数据结构: 考虑到pelco-D和pelco-P协议命令消息格式的规定,
对于pelco-D定义命令消息:
static struct st_message {
char command1, command2, data1, data2;
} send_(消息各部分的含义和规定见本文档第三部分)
对于pelco-P定义命令消息:
static struct st_message {
char data1, data2, data3, data4;
} send_(消息各部分的含义和规定见本文当第三部分)
*str_cmd为传参,此字符串中应包括需要实现的功能,操作,速度等信息。功能命令应包括:
TILT_UP 上TILT_DOWN下PAN_RIGHT右 PAN_LEFT 左:
PT_LEFT_DOWN 左下
PT_RIGHT_UP
SET_PRESET
设置预制点
GOTO_PRESET 运动到预置点
PAN_AUTO_STOP停止自动扫描
可以将要实现的各种功能定义成枚举类型,然后将各个功能下的具体操作动作也定义成枚举类型。
ptz_init 模块主要完成打开串口,并对串口进行设置,设置波特率,数据位,校验位等
ptz_exit 模块主要来关闭串口操作。实现比较简单
ptz_message_handle模块是主要实现部分,实现命令的解析,根据要实现的功能设置send_msg.结构体,并将此结构体,通过RS485串口发送给云台。此部分大体的流程设计如下:
ptz_message_handle模块:
*str_arg参数需要规定一下格式以便解析函数能够正确解析它可以根据自己需要的进行规定,例如各项参数间采用@符号隔开等。
不良信息反馈
 电话: 提示音后按1键(按当地市话标准计费) 欢迎批评指正
其他人浏览过
” 相关文章推荐
郑重声明:本站资讯源于互联网新闻网站和频道,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com),我们审核后将会尽快处理。会员咨询QQ群: 入群验证:企业库会员咨询.Linux下cfsetospeed和cfsetispeed函数_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Linux下cfsetospeed和cfsetispeed函数
来源:Linux社区&
作者:Linux
对于波特率的设置通常使用cfsetospeed和cfsetispeed函数来完成。获取波特率信息是通过cfgetispeed和cfgetospeed函数来完成的。
cfsetospeed函数
int cfsetospeed(struct termios *termptr, speed_t speed);
struct termios *termptr - 指向termios结构的指针
speed_t speed - 需要设置的输出波特率
如果成功返回0,否则返回-1
cfsetispeed函数
int cfsetispeed(struct termios *termptr, speed_t speed);
struct termios *termptr - 指向termios结构的指针
speed_t speed - 需要设置的输入波特率
如果成功返回0,否则返回-1
cfgetospeed函数
函数原型:
speed_t cfgetospeed(const struct termios *termptr);
const struct termios - 指向termios结构的指针
返回输出波特率
cfgetispeed函数
speed_t cfgetispeed(const struct termios *termptr);
const struct termios *termptr - 指向termios结构的指针
返回输入波特率
波特率常量:
CBAUD 掩码
B50 50波特
B75 75波特
B110 100波特
B134 134波特
B150 150波特
B200 200波特
B300 300波特
B600 600波特
相关资讯 & & &
& (04月11日)
& (04/16/:35)
& (11月24日)
& (03月03日)
& (01/19/:21)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款下次自动登录
现在的位置:
& 综合 & 正文
linux下cfsetospeed和cfsetispeed函数
对于波特率的设置通常使用cfsetospeed和cfsetispeed函数来完成。获取波特率信息是通过cfgetispeed和cfgetospeed函数来完成的。
cfsetospeed函数
int cfsetospeed(struct termios*termptr, speed_t speed);
struct termios *termptr -指向termios结构的指针
speed_t speed - 需要设置的输出波特率
如果成功返回0,否则返回-1
cfsetispeed函数
int cfsetispeed(struct termios*termptr, speed_t speed);
struct termios *termptr -指向termios结构的指针
speed_t speed - 需要设置的输入波特率
如果成功返回0,否则返回-1
cfgetospeed函数
函数原型:
speed_t cfgetospeed(const structtermios *termptr);
const struct termios -指向termios结构的指针
返回输出波特率
cfgetispeed函数
speed_t cfgetispeed(const structtermios *termptr);
const struct termios *termptr -指向termios结构的指针
返回输入波特率
波特率常量:
CBAUD 掩码
B50 50波特
B75 75波特
B110 100波特
B134 134波特
B150 150波特
B200 200波特
B300 300波特
B600 600波特
&&&&推荐文章:
【上篇】【下篇】Linux串口编程 - wblyuyang - 博客园
.串口概述&常见数据通信方式:并行通信,串行通信&UART的主要操作:&& &数据发送及接受&& &产生中断&& &产生波特率&& &Loopback模式&&& &红外模式&& &自动流控模式& &串口参数的配置主要包括:波特率、数据位、停止位、流控协议。&linux中的串口设备文件放于/de/目录下,串口一,串口二分别为"/dev/ttyS0","/dev/ttyS1".在linux下操作串口与操作文件相同..串口详细配置&包括:波特率、数据位、校验位、停止位等。串口设置由下面的结构体实现:&&&&& struct termios&&&&& {&tcflag_t& c_& //input flags&tcflag_t& c_& //output flags&tcflag_t& c_& //control flags&tcflag_t& c_& //local flags&cc_t&&&&& c_cc[NCCS]; //control characters&&&&& };&&&&&&&& 该结构体中c_cflag最为重要,可设置波特率、数据位、校验位、停止位。在设置波特率时需要在数字前加上'B',
如B9600,B15200.使用其需通过&与&&或&操作方式:
&输入模式c_iflag成员控制端口接收端的字符输入处理:
.串口控制函数&Tcgetattr&取属性(termios结构)&Tcsetattr&设置属性(termios结构)&cfgetispeed&得到输入速度&Cfgetospeed&得到输出速度&Cfsetispeed&设置输入速度&Cfsetospeed&设置输出速度&Tcdrain&&等待所有输出都被传输&tcflow&&挂起传输或接收&tcflush&&刷清未决输入和/或输出&Tcsendbreak&送BREAK字符&tcgetpgrp&得到前台进程组ID&tcsetpgrp&设置前台进程组ID
.串口配置流程&1&保存原先串口配置,用tcgetattr(fd,&oldtio)函数&&struct termios newtio,&& &tcgetattr(fd,&oldtio);&2&激活选项有CLOCAL和CREAD,用于本地连接和接收使用& &newtio.c_cflag | = CLOCAL | CREAD;&3&设置波特率,使用函数cfsetispeed、cfsetospeed&&&&&&&& cfsetispeed(&newtio,B115200);&& &cfsetospeed(&newtio,B115200); &4&设置数据位,需使用掩码设置&& &newtio.c_cflag &= ~CSIZE;& &newtio.c_cflag |= CS8;&5&设置奇偶校验位,使用c_cflag和c_iflag.&& 设置奇校验:&&newtio.c_cflag |= PARENB;&&newtio.c_cflag |= PARODD;&&newtio.c_iflag |= (INPCK | ISTRIP);&& 设置偶校验:&&newtio.c_iflag |= (INPCK|ISTRIP);&&newtio.c_cflag |= PARENB;&&newtio.c_cflag |= ~PARODD;&6&设置停止位,通过激活c_cflag中的CSTOPB实现。若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB。&&newtio.c_cflag &= ~CSTOPB;&7&设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时,可设为0:&& &newtio.c_cc[VTIME] = 0;&&newtio.c_cc[VMIN]& = 0;&8&处理要写入的引用对象&& tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送).&&int tcflush(int filedes,int quene)&&quene数应当是下列三个常数之一:&&& *TCIFLUSH& 刷清输入队列&&& *TCOFLUSH& 刷清输出队列&&& *TCIOFLUSH 刷清输入、输出队列&&例如:tcflush(fd,TCIFLUSH);&9&激活配置。在完成配置后,需要激活配置使其生效。使用tcsetattr()函数:&&int tcsetattr(int filedes,int opt,const struct termios *termptr);&& opt使我们可以指定在什么时候新的终端属性才起作用,&&*TCSANOW:更改立即发生&&*TCSADRAIN:发送了所有输出后更改才发生。若更改输出参数则应使用此选项&&*TCSAFLUSH:发送了所有输出后更改才发生。更进一步,在更改发生时未读的&&&&&&&&&&&& 所有输入数据都被删除(刷清).&& 例如: tcsetattr(fd,TCSANOW,&newtio);.串口使用详解.打开串口&fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);&参数--O_NOCTTY:通知linux系统,这个程序不会成为这个端口的控制终端.&&&&&&&&&&&&& O_NDELAY:通知linux系统不关心DCD信号线所处的状态(端口的另一端是否激活或者停止).&然后恢复串口的状态为阻塞状态,用于等待串口数据的读入,用fcntl函数:&&fcntl(fd,F_SETFL,0);& //F_SETFL:设置文件flag为0,即默认,即阻塞状态&接着测试打开的文件描述符是否应用一个终端设备,以进一步确认串口是否正确打开.&&isatty(STDIN_FILENO);.读写串口&串口的读写与普通文件一样,使用read,write函数&&read(fd,buff,8);&&write(fd,buff,8);&Example: seri.c
#include &stdio.h&#include &string.h&#include &sys/types.h&#include &errno.h&#include &sys/stat.h&#include &fcntl.h&#include &unistd.h&#include &termios.h&#include &stdlib.h&int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop){
struct termios newtio,
( tcgetattr( fd,&oldtio)
perror("SetupSerial 1");
return -1;
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag
CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( nBits )
newtio.c_cflag |= CS7;
newtio.c_cflag |= CS8;
switch( nEvent )
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
newtio.c_cflag &= ~PARENB;
}switch( nSpeed )
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
if( nStop == 1 )
newtio.c_cflag &=
else if ( nStop == 2 )
newtio.c_cflag |=
newtio.c_cc[VTIME]
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
perror("com set error");
return -1;
printf("set done!\n");
return 0;}int open_port(int fd,int comport){
char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
if (comport==1)
fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
perror("Can't Open Serial Port");
return(-1);
printf("open ttyS0 .....\n");
else if(comport==2)
fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
perror("Can't Open Serial Port");
return(-1);
printf("open ttyS1 .....\n");
else if (comport==3)
fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
perror("Can't Open Serial Port");
return(-1);
printf("open ttyS2 .....\n");
if(fcntl(fd, F_SETFL, 0)&0)
printf("fcntl failed!\n");
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
return}int main(void){
int nread,i;
char buff[]="Hello\n";
if((fd=open_port(fd,1))&0)
perror("open_port error");
if((i=set_opt(fd,115200,8,'N',1))&0)
perror("set_opt error");
printf("fd=%d\n",fd);
nread=read(fd,buff,8);
printf("nread=%d,%s\n",nread,buff);
close(fd);}

我要回帖

更多关于 凤梨和菠萝的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信