linux環(huán)境下C語言實(shí)現(xiàn)非阻塞方式讀取字符串?dāng)?shù)據(jù)的串口測試程序,即串口工具的編寫_第1頁
linux環(huán)境下C語言實(shí)現(xiàn)非阻塞方式讀取字符串?dāng)?shù)據(jù)的串口測試程序,即串口工具的編寫_第2頁
linux環(huán)境下C語言實(shí)現(xiàn)非阻塞方式讀取字符串?dāng)?shù)據(jù)的串口測試程序,即串口工具的編寫_第3頁
linux環(huán)境下C語言實(shí)現(xiàn)非阻塞方式讀取字符串?dāng)?shù)據(jù)的串口測試程序,即串口工具的編寫_第4頁
linux環(huán)境下C語言實(shí)現(xiàn)非阻塞方式讀取字符串?dāng)?shù)據(jù)的串口測試程序,即串口工具的編寫_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、linux環(huán)境下C語言實(shí)現(xiàn)非阻塞方式讀取字符串?dāng)?shù)據(jù)的串口測試程序,即串口工具的編寫一、前言1.1 關(guān)于串口測試工具,網(wǎng)上已經(jīng)有集成好的應(yīng)用程序提供大家使用,但其只提供功能接口,內(nèi)部具體怎么實(shí)現(xiàn)的還需要自己去探索; 1.2 關(guān)于串口通信的測試程序在網(wǎng)上已經(jīng)是數(shù)見不鮮,但也不排除很多是直接“參考”別人的(ctrl+c),而且很多代碼沒有相關(guān)注釋,從而某些細(xì)節(jié)性的問題就被忽略; 1.3 本例程序不需全部讀完,分為3大部分,設(shè)置通信協(xié)議、讀寫字符串函數(shù)編寫、通信的測試函數(shù),測試函數(shù)自己選取看兩個(gè)典型的就OK;如果哪有說的有誤,希望大家指正,多交流共同進(jìn)步; 1.4 要點(diǎn):本文提供了設(shè)置串口通訊的接口,

2、方便大家對(duì)程序的復(fù)用,感覺還是面向?qū)ο蟮恼Z言更方便呀;在給模塊發(fā)送指令后需要讀取模塊返回的數(shù)據(jù)時(shí),保險(xiǎn)起見采用阻塞式讀取,且串口一次只能讀取8位byte數(shù)據(jù),注意讀取數(shù)據(jù)的調(diào)用函數(shù);注意在讀寫命令中存在0x00(零)的16進(jìn)制的數(shù)據(jù)時(shí)的方式;通信成功,但恰遇到模塊總返回操作失敗的代碼的問題。二、串口測試程序的實(shí)現(xiàn)2.1 要實(shí)現(xiàn)串口通信的操作,首先是找到需要操作的對(duì)象,即具體的串口設(shè)備,一般都在Linux嵌入式設(shè)備的/dev/路徑下有很多串口設(shè)備,找到自己所要操作的串口設(shè)備,例如本例程所操作的是/dev/ttySAC0, ttySAC0為串口設(shè)備名稱;2.2 模塊的串口通信協(xié)議,不同的模塊之間有

3、細(xì)微差別,自己作相應(yīng)的改動(dòng)就好。本例程的通信協(xié)議:波特率9600bps, 8位數(shù)據(jù)位,1位起始位,一位停止位,無奇偶校驗(yàn)。通信成功時(shí),返回的是操作成功或者操作失敗的代碼,PS:操作失敗并不是說的是通信失敗,因?yàn)槿ピL問模塊時(shí),模塊給了應(yīng)答,表明通信是成功的,只能說明是硬件本身操作失敗。發(fā)送的指令中存在CS,其值為0減去前面CS前面所有16進(jìn)制的相加-例:80 06 05 01 CS, CS為:0-(80+06+05+01)=74 ,即需要發(fā)送的代碼為80 06 05 01 74;2.3 源碼如下:#include<string.h>#include<stdio.h>#in

4、clude<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<termios.h>#include<fcntl.h>#include<errno.h>#define TRUE 1#define FALSE -1#define BUFF_MAXSIZE 2048#define FREQUENCY_00 0 /設(shè)定的頻率為0#define FREQUENCY_05 5 /設(shè)定的頻率為5#define FREQUE

5、NCY_10 10 /設(shè)定的頻率為10#define FREQUENCY_20 20 /設(shè)定的頻率為20#define RESOLUTION_ONE_MM 1 /1表示選擇設(shè)定的分辨率為1mm#define RESOLUTION_Z_P_ONE_MM 2 /2表示選擇設(shè)定的分辨率為0.1mm#define MEASURING_POWER_ON 1 /1表示上電即測開啟 #define MEASURING_POWER_OFF 0 /0表示上電即測關(guān)閉typedef unsigned char un_char;/初始化設(shè)置,即設(shè)置通信協(xié)議int OpenDev(char *dev);/打開串口設(shè)備

6、文件int set_speed(int fd, int speed, struct termios* newtio);/設(shè)置波特率int Set_Parity(int fd, int databits, int stopbits, int parity);/設(shè)置數(shù)據(jù)位、停止位、校驗(yàn)位/數(shù)據(jù)讀寫函數(shù)int Write_Data(int fd, void *buf, int len);/發(fā)送命令代碼函數(shù)int Read_Data(int fd, char *buff);/接收命令代碼函數(shù)/模塊的功能函數(shù)int Open_LaserModule(int fd);/模塊的打開int Close_Las

7、erModule(int fd);/模塊的關(guān)閉int Set_Address(int fd);/設(shè)置地址un_char* Read_Parameter(int fd, un_char* device_parameter);/讀取參數(shù)un_char* Read_Device_Num(int fd, un_char* device_num);/讀取機(jī)器號(hào)int Distance_Modification(int fd, int decrease_or_increase, int distance_int);/距離修改,參數(shù)decrease_or_increase表示修正可選為取負(fù)或者取正,參數(shù)di

8、stance表示要修正的距離int Mea_Interval(int fd, int interval_time_int);/連續(xù)測量時(shí)設(shè)置數(shù)據(jù)返回時(shí)間間隔,參數(shù)interval_time_int表示要設(shè)定的時(shí)間間隔為interval_time_int秒int Distance_StartStop(int fd, int position_int);/設(shè)置距離起止點(diǎn),參數(shù)position_int的值(1頂端算起;0加上模塊長度+上面的距離修正)int Set_MeasuringRange(int fd, int range);/設(shè)定量程,range表示要設(shè)定的量程大小05, 10, 30, 5

9、0, 80int Set_Frequency(int fd, int freg);/設(shè)定頻率,freg表示要設(shè)定的頻率大小,00,05,10,20int Set_Resolution(int fd, int mode);/設(shè)定分辨率,當(dāng)mode=1表示設(shè)定的分辨率為1mm,當(dāng)mode=2表示設(shè)定的分辨率為0.1mmint Measuring_Power(int fd, int on_off);/設(shè)定上電即測,on_off=1表示開啟該功能,on_off=0表示關(guān)閉該功能int Single_Measurement_Broadcast(int fd);/單次測量(廣播命令,返回結(jié)果存入模塊緩存)

10、un_char* Read_Cache(int fd, un_char* cache_data);/讀取緩存un_char* Single_Measurement(int fd, un_char* single_mea);/單次測量un_char* Continuous_Measurement(int fd, un_char* continuous_mea);/連續(xù)測量int speed_arr=B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B120

11、0, B300;int name_arr=115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300;int main(int argc, char *argv) int fd; un_char Buff_data_deviceBUFF_MAXSIZE = 0;/我只是測試用,就在棧分配的空間,正式編寫一般需要自己分配動(dòng)態(tài)內(nèi)存 struct termios oldtio, newtio; /打開串口 char *dev = "/dev/ttyS

12、AC0" fd = OpenDev(dev); tcgetattr(fd, &oldtio); if(fd > 0) set_speed(fd, 9600, &newtio);/設(shè)置9600bps波特率 else printf("Can't Open Serial Port!/n"); exit(0); if(Set_Parity(fd, 8, 1, 'S') = FALSE)/調(diào)用設(shè)置8位數(shù)據(jù)位,1位停止位及無校驗(yàn)位 printf("Set Parityu Error!/n"); exit(1);

13、 /測試函數(shù)的調(diào)用 Open_LaserModule(fd); Set_Resolution(fd, RESOLUTION_Z_P_ONE_MM); Measuring_Power(fd, MEASURING_POWER_ON); Set_Frequency(fd, FREQUENCY_05); Set_MeasuringRange(fd, RANGE_80); sleep(5); Read_Parameter(fd, Buff_data_device); Set_Address(fd); Distance_Modification(fd, DISTANCE_IN, 2); Mea_Inter

14、val(fd, 5); Distance_StartStop(fd, 0); sleep(5); Read_Cache(fd, Buff_data_device); sleep(5); Single_Measurement(fd, Buff_data_device); sleep(5); Continuous_Measurement(fd, Buff_data_device); Close_LaserModule(fd); close(fd);/打開文件設(shè)備int OpenDev(char *dev) int fd = open(dev, O_RDWR | O_NOCTTY | O_NDELA

15、Y); if(fd = -1) printf("Can't Open Serial Port!n"); return FALSE; else return fd;/設(shè)置波特率int set_speed(int fd, int speed, struct termios* newtio) int i; int status; struct termios* Opt = newtio; tcgetattr(fd, Opt); for(i = 0; i < sizeof(speed_arr)/sizeof(int); i+) if(speed = name_arri

16、) tcflush(fd, TCIOFLUSH); cfsetispeed(Opt, speed_arri); cfsetospeed(Opt, speed_arri); status = tcsetattr(fd, TCSANOW, Opt); if(status != 0) printf("tcsetattr failed!n"); return FALSE; tcflush(fd, TCIOFLUSH); return TRUE;/設(shè)置fd的數(shù)據(jù)位、停止位、奇偶檢驗(yàn)位int Set_Parity(int fd, int databits, int stopbits,

17、int parity) struct termios options; if(tcgetattr(fd, &options) != 0) printf("Setup Serial 1 error!n"); return FALSE; /對(duì)options的起始地址開始的termios結(jié)構(gòu)體內(nèi)存置零 bzero(&options,sizeof(options); options.c_cflag &= CSIZE; /選擇數(shù)據(jù)位 switch(databits) case 7:options.c_cflag |= CS7; break; case 8:op

18、tions.c_cflag |= CS8; break; default:printf("Unsupported data size!/n"); return FALSE; /選擇奇偶校驗(yàn) switch(parity) case 'n': case 'N': options.c_cflag &= (PARENB); options.c_cflag &= (INPCK); break; case 'o':/偶校驗(yàn) case 'O': options.c_cflag |= (PARODD | PAR

19、ENB); options.c_cflag |= INPCK; break; case 'e':/偶校驗(yàn) case 'E': options.c_cflag |= PARENB; options.c_cflag &= (PARODD); options.c_cflag |= INPCK; break; case 's':/無奇偶校驗(yàn) case 'S': options.c_cflag &= (PARENB); options.c_cflag &= (CSTOPB); break; default: prin

20、tf("Unsupported parity!/n"); return FALSE; /選擇停止位 switch(stopbits) case 1: options.c_cflag &= (CSTOPB); break; case 2: options.c_cflag |= CSTOPB; break; default: printf("Unsupported stop bits!/n"); return FALSE; if(parity != 'n') /修改控制模式,保證程序不會(huì)占用串口 options.c_cflag |=

21、CLOCAL; /修改控制模式,使得能夠從串口中讀取輸入數(shù)據(jù) options.c_cflag |= CREAD; options.c_lflag &= (ICANON | ECHO | ECHOE); options.c_iflag &= (IXON | IXOFF | IXANY); options.c_lflag &= (ICANON | ECHO | ECHOE | ISIG); /*Input*/ options.c_oflag &= OPOST; /有字符處理或經(jīng)過TIME個(gè)0.1秒后返回 options.c_ccVTIME = 0; options.

22、c_ccVMIN = 0; /如果發(fā)生數(shù)據(jù)溢出,接收數(shù)據(jù),但是不再讀取 tcflush(fd, TCIFLUSH); /激活配置 (將修改后的termios數(shù)據(jù)設(shè)置到串口中) if(tcsetattr(fd, TCSANOW, &options) != 0) printf("Setup Serial error!n"); return FALSE; return 0;/寫數(shù)據(jù)函數(shù)int Write_Data(int fd, void *buf, int len) int m_fd = fd; int write_count = 0; int nwrite = 0;

23、if(m_fd <0) printf("Please Open The Device File!n"); while(len > 0) nwrite = write(fd, (char*)buf + write_count, len); if(nwrite < 1) printf("Write Datda Fail!n"); break; write_count += nwrite; len -= nwrite; / 清除所有正在發(fā)生的I/O數(shù)據(jù) tcflush(fd, TCIOFLUSH); return write_count;/讀

24、取數(shù)據(jù)int Read_Data(int fd, char* buff) int nread = 0; int fd_max; int nselect; fd_set readfds; FD_ZERO(&readfds); FD_SET(fd,&readfds); fd_max = fd+1; nselect = select(fd_max, &readfds, NULL, NULL, NULL); memset(buff, 0, sizeof(buff); if(nselect <= 0) printf("select failed"); e

25、lse if(FD_ISSET(fd, &readfds) >0) nread = read(fd, buff, 8); buffnread = '0' int j = 0; while(buffj != '0') printf("the readable data is 0x%xn", buffj); j+; return nread;/開啟模塊 int Open_LaserModule(int fd) un_char Buff_OpenBUFF_MAXSIZE = 0x80, 0x06, 0x05, 0x01, 0x74;

26、un_char Open_SucceededBUFF_MAXSIZE = 0x80, 0x06, 0x85, 0x01, 0xF4; un_char Open_FailedBUFF_MAXSIZE = 0x80, 0x06, 0x85, 0x00, 0xF5; Write_Data(fd, Buff_Open, strlen(Buff_Open); Read_Data(fd, Buff_Open); if(strcmp(Buff_Open, Open_Succeeded) = 0) printf("Open_LaserModule Succeeded!n"); else i

27、f(strcmp(Buff_Open, Open_Failed) = 0) printf("Open_LaserModule Failed, Please Try Again!n"); else printf("NGn"); return FALSE; return TRUE;/關(guān)閉模塊 int Close_LaserModule(int fd) un_char Buff_CloseBUFF_MAXSIZE = 0x80, 0x06, 0x05, 0x00, 0x75; un_char Close_SucceededBUFF_MAXSIZE = 0x80

28、, 0x06, 0x85, 0x01, 0xF4; un_char Close_FailedBUFF_MAXSIZE = 0x80, 0x06, 0x85, 0x00, 0xF5; /要寫的數(shù)據(jù)中間有0x00,因此把要的數(shù)據(jù)長度指定為5個(gè)字節(jié),而不用strlen()函數(shù)計(jì)算長度 Write_Data(fd, Buff_Close, 5); Read_Data(fd, Buff_Close); if(strcmp(Buff_Close, Close_Succeeded) = 0) printf("Close_LaserModule Succeeded!n"); else if

29、(strcmp(Buff_Close, Close_Failed) = 0) printf("Close_LaserModule Failed, Please Try Again!n"); else printf("NGn"); return FALSE; return TRUE;/讀取參數(shù)un_char* Read_Parameter(int fd, un_char* device_parameter) un_char Buff_Read_ParameterBUFF_MAXSIZE = 0xFA, 0x06, 0x01, 0xFF; Write_Dat

30、a(fd, Buff_Read_Parameter, strlen(Buff_Read_Parameter); Read_Data(fd, Buff_Read_Parameter); printf("*The parameter have read!*n"); strcpy(device_parameter, Buff_Read_Parameter); return device_parameter;/讀取機(jī)器號(hào),由于串口每次只能讀取8個(gè)字節(jié),而讀取機(jī)器號(hào)的返回代碼有20個(gè)字節(jié),所以讀取三次數(shù)據(jù)un_char* Read_Device_Num(int fd, un_char

31、* device_num) int nread = 0; un_char Buff_Read_DeviceNumBUFF_MAXSIZE = 0xFA, 0x06, 0x04, 0xFC; un_char Buff_read_backBUFF_MAXSIZE = 0; un_char *Buff_bp = Buff_read_back; Write_Data(fd, Buff_Read_DeviceNum, strlen(Buff_Read_DeviceNum); nread = Read_Data(fd, Buff_Read_DeviceNum); memcpy(Buff_bp, Buff_

32、Read_DeviceNum, nread); Buff_bp += nread; nread = Read_Data(fd, Buff_Read_DeviceNum); memcpy(Buff_bp, Buff_Read_DeviceNum, nread); Buff_bp += nread; nread = Read_Data(fd, Buff_Read_DeviceNum); strcpy(Buff_bp, Buff_Read_DeviceNum); strcpy(device_num, Buff_read_back); return device_num;/設(shè)置地址int Set_Ad

33、dress(int fd) un_char Buff_AddressBUFF_MAXSIZE = 0xFA, 0x04, 0x01, 0x80, 0x81; un_char Address_SucceededBUFF_MAXSIZE = 0xFA, 0x04, 0x81, 0x81; un_char Address_FailedBUFF_MAXSIZE = 0xFA, 0x84, 0x81, 0x02, 0xFF; Write_Data(fd, Buff_Address, strlen(Buff_Address); Read_Data(fd, Buff_Address); if(strcmp(

34、Buff_Address, Address_Succeeded) = 0) printf("Set_Address Succeeded!n"); else if(strcmp(Buff_Address, Address_Failed) = 0) printf("Set Address Error, Please Write Again!n"); else printf("NGn"); return FALSE; return TRUE;/距離修改,參數(shù)decrease_or_increase表示修正可選為取負(fù)或者取正,參數(shù)distan

35、ce表示要修正的距離int Distance_Modification(int fd, int decrease_or_increase, int distance_int) un_char decrease_increase = (un_char)decrease_or_increase; un_char distance_ch = (un_char)distance_int; int c_s = -250 - 4 - 6 - decrease_or_increase - distance_int;/十進(jìn)制250表示十六進(jìn)制0xFA un_char cs = (un_char)c_s; un

36、_char Buff_Distance_MoBUFF_MAXSIZE = 0; Buff_Distance_Mo0 = 0xFA; Buff_Distance_Mo1 = 0x04; Buff_Distance_Mo2 = 0x06; Buff_Distance_Mo3 = decrease_increase; Buff_Distance_Mo4 = distance_ch; Buff_Distance_Mo5 = cs; Buff_Distance_Mo6 = '0' un_char Distance_ModificationSdBUFF_MAXSIZE =0xFA, 0x0

37、4, 0x8B, 0x77; un_char Distance_ModificationFdBUFF_MAXSIZE =0xFA, 0x84, 0x8B, 0x01, 0xF6; Write_Data(fd, Buff_Distance_Mo, strlen(Buff_Distance_Mo); Read_Data(fd, Buff_Distance_Mo); if(strcmp(Buff_Distance_Mo, Distance_ModificationSd) = 0) if(decrease_or_increase = 43) printf("Distance_Increase

38、_Modification_Succeededn"); else printf("Distance_Decrease_Modification_Succeededn"); else if(strcmp(Buff_Distance_Mo, Distance_ModificationFd) = 0) if(decrease_or_increase = 43) printf("Distance_Increase_Modification_Failedn"); else printf("Distance_Decrease_Modificati

39、on_Failedn"); else printf("NGn"); return FALSE; return TRUE;/連續(xù)測量時(shí)設(shè)置數(shù)據(jù)返回時(shí)間間隔,參數(shù)interval_time_int表示要設(shè)定的時(shí)間間隔為interval_time_int秒int Mea_Interval(int fd, int interval_time_int) int c_s = -250 - 4 - 5 - interval_time_int;/十進(jìn)制250表示十六進(jìn)制0xFA un_char cs = (un_char)c_s; un_char interval_ch = (u

40、n_char)interval_time_int; un_char Buff_Mea_IntervalBUFF_MAXSIZE = 0; Buff_Mea_Interval0 = 0xFA; Buff_Mea_Interval1 = 0x04; Buff_Mea_Interval2 = 0x05; Buff_Mea_Interval3 = interval_ch; Buff_Mea_Interval4 = cs; Buff_Mea_Interval5 = '0' un_char Mea_IntervalSdBUFF_MAXSIZE = 0xFA, 0x04, 0x85, 0x7

41、D; un_char Mea_IntervalFdBUFF_MAXSIZE = 0xFA, 0x84, 0x85, 0x01, 0xFC; un_char Write_IntervalErrBUFF_MAXSIZE = 0xFA, 0x84, 0x85, 0x01, 0xFA; Write_Data(fd, Buff_Mea_Interval, strlen(Buff_Mea_Interval); Read_Data(fd, Buff_Mea_Interval); if(strcmp(Buff_Mea_Interval, Mea_IntervalSd) = 0) printf("Me

42、a_Interval_Succeededn"); else if(strcmp(Buff_Mea_Interval, Mea_IntervalFd) = 0) printf("Mea_Interval_Failed, Please Try Again!n"); else if(strcmp(Buff_Mea_Interval, Write_IntervalErr) = 0) printf("Mea_Interval_Errorn"); else printf("NGn"); return FALSE; return TRUE

43、;/設(shè)置距離起止點(diǎn),參數(shù)position_int的值(1頂端算起;0加上模塊長度+上面的距離修正)int Distance_StartStop(int fd, int position_int) int c_s = -250 - 4 - 8 - position_int;/十進(jìn)制250表示十六進(jìn)制0xFA un_char cs = (un_char)c_s; un_char position_ch = (un_char)position_int; un_char Buff_StartStopBUFF_MAXSIZE = 0; Buff_StartStop0 = 0xFA; Buff_Start

44、Stop1 = 0x04; Buff_StartStop2 = 0x08; Buff_StartStop3 = position_ch; Buff_StartStop4 = cs; Buff_StartStop5 = '0' un_char Mea_Distance_StartStopSdBUFF_MAXSIZE = 0xFA, 0x04, 0x88, 0x7A; un_char Mea_Distance_StartStopFdBUFF_MAXSIZE = 0xFA, 0x84, 0x88, 0x01, 0xF9; /要寫的數(shù)據(jù)中間有0x00,因此把要的數(shù)據(jù)長度指定為5個(gè)字節(jié),

45、而不用strlen()函數(shù)計(jì)算長度 if(Buff_StartStop3 = 0x00) Write_Data(fd, Buff_StartStop, 5); else Write_Data(fd, Buff_StartStop, strlen(Buff_StartStop); Read_Data(fd, Buff_StartStop); if(strcmp(Buff_StartStop, Mea_Distance_StartStopSd) = 0) printf("Mea_Distance_StartStop_Succeeded!n"); else if(strcmp(Buff_Start

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論