pos機上顯示pp,上位機與下位機通信

 新聞資訊  |   2023-04-20 13:07  |  投稿人:pos機之家

網(wǎng)上有很多關于pos機上顯示pp,上位機與下位機通信的知識,也有很多人為大家解答關于pos機上顯示pp的問題,今天pos機之家(m.afbey.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機上顯示pp

pos機上顯示pp

本文鏈接地址: 「鏈接」

一般情況,上位機由ROS框架運行在Ubuntu的樹莓派構成,下位機由STM32F103VET6芯片板載電機,舵機,陀螺儀,里程計等構成。里程計提供ROS需要的速度信息,陀螺儀提供加速度方向等信息給ROS,再加上連接到樹莓派上的激光雷達,ROS就可以進行SLAM制圖和導航了。下位機接收到ROS下發(fā)的速度信息后,轉(zhuǎn)換成電機的PWM信號和舵機的PWM信號進行方向和速度控制。

Content:

STM32串口發(fā)送與接收ROS串口發(fā)送與接收

本篇就介紹上位機和下位機進行通信的一種方式:串口通信。

STM32串口發(fā)送與接收

首先進行串口3的初始化,其對應的gpio口為C10發(fā)送,C11接收。

void uart3_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //Enable the AFIO clock //使能AFIO時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //Enable the gpio clock //使能GPIO時鐘 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //Enable the Usart clock //使能USART時鐘GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); //Pin remapping //引腳重映射 //USART_TX 發(fā)送端口配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //C10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//Reuse push-pull output//復用推挽輸出 GPIO_Init(GPIOC, &GPIO_InitStructure); //USART_RX 接收端口配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PC11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Pull up input//上拉輸入 GPIO_Init(GPIOC, &GPIO_InitStructure); //UsartNVIC configuration //UsartNVIC配置 中斷優(yōu)先級 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//Preempt priority //搶占優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//Preempt priority //搶占優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//Enable the IRQ channel //IRQ通道使能NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //Initialize the VIC register with the specified parameters //根據(jù)指定的參數(shù)初始化VIC寄存器NVIC_Init(&NVIC_InitStructure); //USART Initialization Settings 串口初始化設置USART_InitStructure.USART_BaudRate = bound; //Port rate //串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b; //The word length is 8 bit data format //字長為8位數(shù)據(jù)格式USART_InitStructure.USART_StopBits = USART_StopBits_1; //A stop bit //一個停止USART_InitStructure.USART_Parity = USART_Parity_No; //Prosaic parity bits //無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //No hardware data flow control //無硬件數(shù)據(jù)流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//Sending and receiving mode //收發(fā)模式 USART_Init(USART3, &USART_InitStructure); //Initialize serial port 3 //初始化串口3//開啟中斷,其對應的中斷函數(shù)為USART3_IRQHandler,這是啟動函數(shù)里面hard code的 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //Open the serial port to accept interrupts //開啟串口接受中斷 USART_Cmd(USART3, ENABLE); //Enable serial port 3 //使能串口3 }

中斷后,從串口中讀取上位機發(fā)送的數(shù)據(jù)到Receive_Data變量中。并從Receive_Data中解析出3軸的速度:Move_X,Move_Y和Move_Z。

int USART3_IRQHandler(void){static u8 Count=0;u8 Usart_Receive; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //Check if data is received //判斷是否接收到數(shù)據(jù){Usart_Receive = USART_ReceiveData(USART3);//Read the data //讀取數(shù)據(jù)if(Time_count<CONTROL_DELAY)// Data is not processed until 10 seconds after startup //開機10秒前不處理數(shù)據(jù) return 0; //Fill the array with serial data//串口數(shù)據(jù)填入數(shù)組 Receive_Data.buffer[Count]=Usart_Receive; // Ensure that the first data in the array is FRAME_HEADER//確保數(shù)組第一個數(shù)據(jù)為FRAME_HEADERif(Usart_Receive == FRAME_HEADER||Count>0) Count++; else Count=0; if (Count == 11) //Verify the length of the packet //驗證數(shù)據(jù)包的長度{ Count=0; //Prepare for the serial port data to be refill into the array //為串口數(shù)據(jù)重新填入數(shù)組做準備if(Receive_Data.buffer[10] == FRAME_TAIL) //Verify the frame tail of the packet //驗證數(shù)據(jù)包的幀尾{//Data exclusionary or bit check calculation, mode 0 is sent data check//數(shù)據(jù)異或位校驗計算,模式0是發(fā)送數(shù)據(jù)校驗if(Receive_Data.buffer[9] ==Check_Sum(9,0)) {//All modes flag position 0, USART3 control mode //所有模式標志位置0,為Usart3控制模式PS2_ON_Flag=0;Remote_ON_Flag=0;APP_ON_Flag=0;CAN_ON_Flag=0;Usart_ON_Flag=0; //Calculate the target speed of three axis from serial data, unit m/s//從串口數(shù)據(jù)求三軸目標速度, 單位m/sMove_X=XYZ_Target_Speed_transition(Receive_Data.buffer[3],Receive_Data.buffer[4]);Move_Y=XYZ_Target_Speed_transition(Receive_Data.buffer[5],Receive_Data.buffer[6]);Move_Z=XYZ_Target_Speed_transition(Receive_Data.buffer[7],Receive_Data.buffer[8]); } }}} return 0;}

下位機定時給上位機發(fā)送當前小車的速度,加速度,角速度等信息。

void data_transition(void){Send_Data.Sensor_Str.Frame_Header = FRAME_HEADER; //Frame_header //幀頭Send_Data.Sensor_Str.Frame_Tail = FRAME_TAIL; //Frame_tail //幀尾 //According to different vehicle types, different kinematics algorithms were selected to carry out the forward kinematics solution, //and the three-axis velocity was obtained from each wheel velocity//根據(jù)不同車型選擇不同運動學算法進行運動學正解,從各車輪速度求出三軸速度switch(Car_Mode){ case Akm_Car: Send_Data.Sensor_Str.X_speed = ((MOTOR_A.Encoder+MOTOR_B.Encoder)/2)*1000; Send_Data.Sensor_Str.Y_speed = 0;Send_Data.Sensor_Str.Z_speed = ((MOTOR_B.Encoder-MOTOR_A.Encoder)/Wheel_spacing)*1000; break; } //The acceleration of the triaxial acceleration //加速度計三軸加速度Send_Data.Sensor_Str.Accelerometer.X_data= accel[1]; //The accelerometer Y-axis is converted to the ros coordinate X axis //加速度計Y軸轉(zhuǎn)換到ROS坐標X軸Send_Data.Sensor_Str.Accelerometer.Y_data=-accel[0]; //The accelerometer X-axis is converted to the ros coordinate y axis //加速度計X軸轉(zhuǎn)換到ROS坐標Y軸Send_Data.Sensor_Str.Accelerometer.Z_data= accel[2]; //The accelerometer Z-axis is converted to the ROS coordinate Z axis //加速度計Z軸轉(zhuǎn)換到ROS坐標Z軸 //The Angle velocity of the triaxial velocity //角速度計三軸角速度Send_Data.Sensor_Str.Gyroscope.X_data= gyro[1]; //The Y-axis is converted to the ros coordinate X axis //角速度計Y軸轉(zhuǎn)換到ROS坐標X軸Send_Data.Sensor_Str.Gyroscope.Y_data=-gyro[0]; //The X-axis is converted to the ros coordinate y axis //角速度計X軸轉(zhuǎn)換到ROS坐標Y軸if(Flag_Stop==0) //If the motor control bit makes energy state, the z-axis velocity is sent normall //如果電機控制位使能狀態(tài),那么正常發(fā)送Z軸角速度Send_Data.Sensor_Str.Gyroscope.Z_data=gyro[2]; else //If the robot is static (motor control dislocation), the z-axis is 0 //如果機器人是靜止的(電機控制位失能),那么發(fā)送的Z軸角速度為0Send_Data.Sensor_Str.Gyroscope.Z_data=0; //Battery voltage (this is a thousand times larger floating point number, which will be reduced by a thousand times as well as receiving the data).//電池電壓(這里將浮點數(shù)放大一千倍傳輸,相應的在接收端在接收到數(shù)據(jù)后也會縮小一千倍)Send_Data.Sensor_Str.Power_Voltage = Voltage*1000; Send_Data.buffer[0]=Send_Data.Sensor_Str.Frame_Header; //Frame_heade //幀頭 Send_Data.buffer[1]=Flag_Stop; //Car software loss marker //小車軟件失能標志位 //The three-axis speed of / / car is split into two eight digit Numbers//小車三軸速度,各軸都拆分為兩個8位數(shù)據(jù)再發(fā)送Send_Data.buffer[2]=Send_Data.Sensor_Str.X_speed >>8; Send_Data.buffer[3]=Send_Data.Sensor_Str.X_speed ; Send_Data.buffer[4]=Send_Data.Sensor_Str.Y_speed>>8; Send_Data.buffer[5]=Send_Data.Sensor_Str.Y_speed; Send_Data.buffer[6]=Send_Data.Sensor_Str.Z_speed >>8; Send_Data.buffer[7]=Send_Data.Sensor_Str.Z_speed ; //The acceleration of the triaxial axis of / / imu accelerometer is divided into two eight digit reams//IMU加速度計三軸加速度,各軸都拆分為兩個8位數(shù)據(jù)再發(fā)送Send_Data.buffer[8]=Send_Data.Sensor_Str.Accelerometer.X_data>>8; Send_Data.buffer[9]=Send_Data.Sensor_Str.Accelerometer.X_data; Send_Data.buffer[10]=Send_Data.Sensor_Str.Accelerometer.Y_data>>8;Send_Data.buffer[11]=Send_Data.Sensor_Str.Accelerometer.Y_data;Send_Data.buffer[12]=Send_Data.Sensor_Str.Accelerometer.Z_data>>8;Send_Data.buffer[13]=Send_Data.Sensor_Str.Accelerometer.Z_data; //The axis of the triaxial velocity of the / /imu is divided into two eight digits//IMU角速度計三軸角速度,各軸都拆分為兩個8位數(shù)據(jù)再發(fā)送Send_Data.buffer[14]=Send_Data.Sensor_Str.Gyroscope.X_data>>8;Send_Data.buffer[15]=Send_Data.Sensor_Str.Gyroscope.X_data;Send_Data.buffer[16]=Send_Data.Sensor_Str.Gyroscope.Y_data>>8;Send_Data.buffer[17]=Send_Data.Sensor_Str.Gyroscope.Y_data;Send_Data.buffer[18]=Send_Data.Sensor_Str.Gyroscope.Z_data>>8;Send_Data.buffer[19]=Send_Data.Sensor_Str.Gyroscope.Z_data; //Battery voltage, split into two 8 digit Numbers//電池電壓,拆分為兩個8位數(shù)據(jù)發(fā)送Send_Data.buffer[20]=Send_Data.Sensor_Str.Power_Voltage >>8; Send_Data.buffer[21]=Send_Data.Sensor_Str.Power_Voltage; //Data check digit calculation, Pattern 1 is a data check //數(shù)據(jù)校驗位計算,模式1是發(fā)送數(shù)據(jù)校驗Send_Data.buffer[22]=Check_Sum(22,1); Send_Data.buffer[23]=Send_Data.Sensor_Str.Frame_Tail; //Frame_tail //幀尾} void USART3_SEND(void){ unsigned char i = 0;for(i=0; i<24; i++){usart3_send(Send_Data.buffer[i]);} } void usart3_send(u8 data){USART3->DR = data;while((USART3->SR&0x40)==0);}ROS串口發(fā)送與接收

在ROS中注冊小車節(jié)點,并利用節(jié)點的回調(diào)函數(shù)Cmd_Vel_Callback組裝數(shù)據(jù),通過庫serial完成串口數(shù)據(jù)發(fā)送。

void turn_on_robot::Cmd_Vel_Callback(const geometry_msgs::Twist &twist_aux){ short transition; //intermediate variable //中間變量 Send_Data.tx[0]=FRAME_HEADER; //frame head 0x7B //幀頭0X7B Send_Data.tx[1] = 0; //set aside //預留位 Send_Data.tx[2] = 0; //set aside //預留位 //The target velocity of the X-axis of the robot //機器人x軸的目標線速度 transition=0; transition = twist_aux.linear.x*1000; //將浮點數(shù)放大一千倍,簡化傳輸 Send_Data.tx[4] = transition; //取數(shù)據(jù)的低8位 Send_Data.tx[3] = transition>>8; //取數(shù)據(jù)的高8位 //The target velocity of the Y-axis of the robot //機器人y軸的目標線速度 transition=0; transition = twist_aux.linear.y*1000; Send_Data.tx[6] = transition; Send_Data.tx[5] = transition>>8; //The target angular velocity of the robot's Z axis //機器人z軸的目標角速度 transition=0; transition = twist_aux.angular.z*1000; Send_Data.tx[8] = transition; Send_Data.tx[7] = transition>>8; Send_Data.tx[9]=Check_Sum(9,SEND_DATA_CHECK); //For the BBC check bits, see the Check_Sum function //BBC校驗位,規(guī)則參見Check_Sum函數(shù) Send_Data.tx[10]=FRAME_TAIL; //frame tail 0x7D //幀尾0X7D try { if(akm_cmd_vel=="none") Stm32_Serial.write(Send_Data.tx,sizeof (Send_Data.tx)); //Sends data to the downloader via serial port //通過串口向下位機發(fā)送數(shù)據(jù) //else ROS_INFO("akm mode, not subcribe cmd_vel"); } catch (serial::IOException& e) { ROS_ERROR_STREAM("Unable to send data through serial port"); //If sending data fails, an error message is printed //如果發(fā)送數(shù)據(jù)失敗,打印錯誤信息 }}

同時,在ROS的節(jié)點循環(huán)中,從串口讀Stm32_Serial.read下位機發(fā)送過來的數(shù)據(jù)。

bool turn_on_robot::Get_Sensor_Data(){ short transition_16=0, j=0, Header_Pos=0, Tail_Pos=0; //Intermediate variable //中間變量 uint8_t Receive_Data_Pr[RECEIVE_DATA_SIZE]={0}; //Temporary variable to save the data of the lower machine //臨時變量,保存下位機數(shù)據(jù) Stm32_Serial.read(Receive_Data_Pr,sizeof (Receive_Data_Pr)); //Read the data sent by the lower computer through the serial port //通過串口讀取下位機發(fā)送過來的數(shù)據(jù) /*//View the received raw data directly and debug it for use//直接查看接收到的原始數(shù)據(jù),調(diào)試使用 ROS_INFO("%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x", Receive_Data_Pr[0],Receive_Data_Pr[1],Receive_Data_Pr[2],Receive_Data_Pr[3],Receive_Data_Pr[4],Receive_Data_Pr[5],Receive_Data_Pr[6],Receive_Data_Pr[7], Receive_Data_Pr[8],Receive_Data_Pr[9],Receive_Data_Pr[10],Receive_Data_Pr[11],Receive_Data_Pr[12],Receive_Data_Pr[13],Receive_Data_Pr[14],Receive_Data_Pr[15], Receive_Data_Pr[16],Receive_Data_Pr[17],Receive_Data_Pr[18],Receive_Data_Pr[19],Receive_Data_Pr[20],Receive_Data_Pr[21],Receive_Data_Pr[22],Receive_Data_Pr[23]); */ //Record the position of the head and tail of the frame //記錄幀頭幀尾位置 for(j=0;j<24;j++) { if(Receive_Data_Pr[j]==FRAME_HEADER) Header_Pos=j; else if(Receive_Data_Pr[j]==FRAME_TAIL) Tail_Pos=j; } if(Tail_Pos==(Header_Pos+23)) { //If the end of the frame is the last bit of the packet, copy the packet directly to receive_data.rx //如果幀尾在數(shù)據(jù)包最后一位,直接復制數(shù)據(jù)包到Receive_Data.rx // ROS_INFO("1----"); memcpy(Receive_Data.rx, Receive_Data_Pr, sizeof(Receive_Data_Pr)); } else if(Header_Pos==(1+Tail_Pos)) { //如果幀頭在幀尾后面,糾正數(shù)據(jù)位置后復制數(shù)據(jù)包到Receive_Data.rx // If the header is behind the end of the frame, copy the packet to receive_data.rx after correcting the data location // ROS_INFO("2----"); for(j=0;j<24;j++) Receive_Data.rx[j]=Receive_Data_Pr[(j+Header_Pos)$]; } else { //其它情況則認為數(shù)據(jù)包有錯誤 // In other cases, the packet is considered to be faulty // ROS_INFO("3----"); return false; } /* //Check receive_data.rx for debugging use //查看Receive_Data.rx,調(diào)試使用 ROS_INFO("%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x", Receive_Data.rx[0],Receive_Data.rx[1],Receive_Data.rx[2],Receive_Data.rx[3],Receive_Data.rx[4],Receive_Data.rx[5],Receive_Data.rx[6],Receive_Data.rx[7], Receive_Data.rx[8],Receive_Data.rx[9],Receive_Data.rx[10],Receive_Data.rx[11],Receive_Data.rx[12],Receive_Data.rx[13],Receive_Data.rx[14],Receive_Data.rx[15], Receive_Data.rx[16],Receive_Data.rx[17],Receive_Data.rx[18],Receive_Data.rx[19],Receive_Data.rx[20],Receive_Data.rx[21],Receive_Data.rx[22],Receive_Data.rx[23]); */ Receive_Data.Frame_Header= Receive_Data.rx[0]; //The first part of the data is the frame header 0X7B //數(shù)據(jù)的第一位是幀頭0X7B Receive_Data.Frame_Tail= Receive_Data.rx[23]; //The last bit of data is frame tail 0X7D //數(shù)據(jù)的最后一位是幀尾0X7D if (Receive_Data.Frame_Header == FRAME_HEADER ) //Judge the frame header //判斷幀頭 { if (Receive_Data.Frame_Tail == FRAME_TAIL) //Judge the end of the frame //判斷幀尾 { if (Receive_Data.rx[22] == Check_Sum(22,READ_DATA_CHECK)||(Header_Pos==(1+Tail_Pos))) //BBC check passes or two packets are interlaced //BBC校驗通過或者兩組數(shù)據(jù)包交錯 { Receive_Data.Flag_Stop=Receive_Data.rx[1]; //set aside //預留位 Robot_Vel.X = Odom_Trans(Receive_Data.rx[2],Receive_Data.rx[3]); //Get the speed of the moving chassis in the X direction //獲取運動底盤X方向速度 Robot_Vel.Y = Odom_Trans(Receive_Data.rx[4],Receive_Data.rx[5]); //Get the speed of the moving chassis in the Y direction, The Y speed is only valid in the omnidirectional mobile robot chassis //獲取運動底盤Y方向速度,Y速度僅在全向移動機器人底盤有效 Robot_Vel.Z = Odom_Trans(Receive_Data.rx[6],Receive_Data.rx[7]); //Get the speed of the moving chassis in the Z direction //獲取運動底盤Z方向速度 //MPU6050 stands for IMU only and does not refer to a specific model. It can be either MPU6050 or MPU9250 //Mpu6050僅代表IMU,不指代特定型號,既可以是MPU6050也可以是MPU9250 Mpu6050_Data.accele_x_data = IMU_Trans(Receive_Data.rx[8],Receive_Data.rx[9]); //Get the X-axis acceleration of the IMU //獲取IMU的X軸加速度 Mpu6050_Data.accele_y_data = IMU_Trans(Receive_Data.rx[10],Receive_Data.rx[11]); //Get the Y-axis acceleration of the IMU //獲取IMU的Y軸加速度 Mpu6050_Data.accele_z_data = IMU_Trans(Receive_Data.rx[12],Receive_Data.rx[13]); //Get the Z-axis acceleration of the IMU //獲取IMU的Z軸加速度 Mpu6050_Data.gyros_x_data = IMU_Trans(Receive_Data.rx[14],Receive_Data.rx[15]); //Get the X-axis angular velocity of the IMU //獲取IMU的X軸角速度 Mpu6050_Data.gyros_y_data = IMU_Trans(Receive_Data.rx[16],Receive_Data.rx[17]); //Get the Y-axis angular velocity of the IMU //獲取IMU的Y軸角速度 Mpu6050_Data.gyros_z_data = IMU_Trans(Receive_Data.rx[18],Receive_Data.rx[19]); //Get the Z-axis angular velocity of the IMU //獲取IMU的Z軸角速度 //Linear acceleration unit conversion is related to the range of IMU initialization of STM32, where the range is ±2g=19.6m/s^2 //線性加速度單位轉(zhuǎn)化,和STM32的IMU初始化的時候的量程有關,這里量程±2g=19.6m/s^2 Mpu6050.linear_acceleration.x = Mpu6050_Data.accele_x_data / ACCEl_RATIO; Mpu6050.linear_acceleration.y = Mpu6050_Data.accele_y_data / ACCEl_RATIO; Mpu6050.linear_acceleration.z = Mpu6050_Data.accele_z_data / ACCEl_RATIO; //The gyroscope unit conversion is related to the range of STM32's IMU when initialized. Here, the range of IMU's gyroscope is ±500°/s //Because the robot generally has a slow Z-axis speed, reducing the range can improve the accuracy //陀螺儀單位轉(zhuǎn)化,和STM32的IMU初始化的時候的量程有關,這里IMU的陀螺儀的量程是±500°/s //因為機器人一般Z軸速度不快,降低量程可以提高精度 Mpu6050.angular_velocity.x = Mpu6050_Data.gyros_x_data * GYROSCOPE_RATIO; Mpu6050.angular_velocity.y = Mpu6050_Data.gyros_y_data * GYROSCOPE_RATIO; Mpu6050.angular_velocity.z = Mpu6050_Data.gyros_z_data * GYROSCOPE_RATIO; //Get the battery voltage //獲取電池電壓 transition_16 = 0; transition_16 |= Receive_Data.rx[20]<<8; transition_16 |= Receive_Data.rx[21]; Power_voltage = transition_16/1000+(transition_16 % 1000)*0.001; //Unit conversion millivolt(mv)->volt(v) //單位轉(zhuǎn)換毫伏(mv)->伏(v) return true; } } } return false;}

以上就是關于pos機上顯示pp,上位機與下位機通信的知識,后面我們會繼續(xù)為大家整理關于pos機上顯示pp的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://m.afbey.com/news/21273.html

你可能會喜歡:

版權聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。