C语言会有操作串口的库函数的,按照串口库函数标识实现调用就可以了。
成都创新互联致力于互联网品牌建设与网络营销,包括网站制作、成都做网站、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。成都创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,成都创新互联核心团队十载专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。
用C怎么写获取串口的内容
看驱动程序的接口啊
一般是是open(“口名”)
用C/C++写一扒游个小程序读取串口接收到贺此销的数据
你太幸运了,刚好我有一个,你在禅游vc++6.0下测试一下。
/* serrecv.c */
/* Receives and saves a file over a serial port */
/* Last modified: Septemeber 21, 2005 */
/* [goman89] */
#include
#include
#include
/* Function to print out usage information */
void usage(void);
/* Function to set up the serial port settings with the specified baud rate,
no parity, and one stop bit */
void set_up_serial_port(HANDLE h, long baud);
/* Function to receive and save file from serial port */
void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length);
int main(int argc, char **argv)
{
HANDLE serial_port; /* Handle to the serial port */
long baud_rate = 9600; /* Baud rate */
char port_name[] = "COM1:"; /* Name of serial port */
unsigned long file_size; /* Size of file to receive in bytes */
unsigned long bytes_received; /* Bytes received from serial port */
unsigned long file_name_size; /* Size of file name in bytes */
char file_name[256]; /* Name of file to receive */
/* Check mand line */
if (argc == 3)
{
/* Read in baud rate */
if (argv[1][1] != 'b' || sscanf(argv[2], "%ld", baud_rate) != 1)
{
usage;
exit(0);
}
}
else if (argc != 1)
{
usage;
exit(0);
}
/* Open up a handle to the serial port */
serial_port = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
/* Make sure port was opened */
if (serial_port == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "Error opening port\n");
CloseHandle(serial_port);
exit(0);
}
/* Set up the serial port */
set_up_serial_port(serial_port, baud_rate);
/* Receive file name size from serial port */
ReadFile(serial_port, (void *)file_name_size, sizeof(unsigned long), bytes_received, NULL);
if (bytes_received != sizeof(unsigned long))
{
fprintf(stderr, "Error getting file name size.\n");
CloseHandle(serial_port);
exit(0);
}
/* Receive file name from serial port */
ReadFile(serial_port, (void *)file_name, file_name_size, bytes_received, NULL);
if (bytes_received != file_name_size)
{
fprintf(stderr, "Error retrieving file name.\n");
CloseHandle(serial_port);
exit(0);
}
/* Append NULL terminator to end of string */
file_name[bytes_received] = '\0';
/* Receive file size from serial port */
ReadFile(serial_port, (void *)file_size, sizeof(unsigned long), bytes_received, NULL);
if (bytes_received != sizeof(unsigned long))
{
fprintf(stderr, "Error getting file size.\n");
CloseHandle(serial_port);
exit(0);
}
/* Get the file from the serial port */
get_file_from_serial_port(serial_port, file_name, file_size);
/* Print out success information */
printf("\n%lu bytes successfully received and saved as %s\n", file_size, file_name);
/* Close handle */
CloseHandle(serial_port);
return 0;
}
void usage(void)
{
fprintf(stderr, "Usage:\n");
fprintf(stderr, "\tserrecv [-b baud rate]\n");
fprintf(stderr, "\tDefault baud rate is 9600\n");
fprintf(stderr, "tSupported baud rates: 1200, 2400, 4800, 9600, 14400, 19200\n");
return;
}
void set_up_serial_port(HANDLE h, long baud)
{
DCB properties; /* Properties of serial port */
/* Get the properties */
GetmState(h, properties);
/* Set the baud rate */
switch(baud)
{
case 1200:
properties.BaudRate = CBR_1200;
break;
case 2400:
properties.BaudRate = CBR_2400;
break;
case 4800:
properties.BaudRate = CBR_4800;
break;
case 9600:
properties.BaudRate = CBR_9600;
break;
case 14400:
properties.BaudRate = CBR_14400;
break;
case 19200:
properties.BaudRate = CBR_19200;
break;
case 38400:
properties.BaudRate = CBR_38400;
break;
default:
fprintf(stderr, "Invalid baud rate: %ld\n", baud);
usage;
exit(0);
break;
}
/* Set the other properties */
properties.Parity = NOPARITY;
properties.ByteSize = 8;
properties.StopBits = ONESTOPBIT;
SetmState(h, properties);
return;
}
void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length)
{
FILE *data_file; /* File to create */
unsigned long bytes_left = file_length; /* Bytes left to receive */
unsigned long bytes_received_total = 0; /* Total bytes received */
unsigned long bytes_to_receive; /* Number of bytes to receive */
unsigned long bytes_received; /* Number of bytes receive */
char buffer[200]; /* Buffer to store data */
/* Open the file */
data_file = fopen(file_name, "wb");
/* Quit if file couldn't be opened */
if (data_file == NULL)
{
fprintf(stderr, "Could not create file %s\n", file_name);
CloseHandle(h);
exit(0);
}
while (1)
{
/* Determine how many bytes to read */
if (bytes_left == 0)
{
break;
}
else if (bytes_left 200)
{
bytes_to_receive = bytes_left;
}
else
{
bytes_to_receive = 200;
}
/* Receive data over serial cable */
ReadFile(h, (void *)buffer, bytes_to_receive, bytes_received, NULL);
if (bytes_received != bytes_to_receive)
{
fprintf(stderr, "Error reading file.\n");
CloseHandle(h);
exit(0);
}
/* Save buffer to file */
fwrite((void *)buffer, 1, bytes_received, data_file);
/* Decrement number of bytes left */
bytes_left -= bytes_received;
/* Increment number of bytes received */
bytes_received_total += bytes_received;
/* Print out progress */
printf("\r%5lu bytes received.", bytes_received_total);
}
fclose(data_file);
return;
}
C语言变成实现串口收发数据
#include
#include
int main(void)
{
FILE *fp;
char temp;
char buf[100];
if((fp = fopen("3","r")) == NULL)
puts("this way doesn't work!\n");
else
puts("this way works!\n");
while(1)
{
temp = 0;
fscanf(fp,"%c",temp);
if(temp != 0)
putchar(temp);
else
Sleep(100);
}
fclose(fp);
return 0;
}
以前弄的,好久没看了,不知到对不对。
还有下面这段:
#include
#include
HANDLE h;
int main(void)
{
h=CreateFile(TEXT("COM3"),//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(h==(HANDLE)-1)
{
printf("打开COM失败!\n");
return FALSE;
}
else
{
printf("COM打开成功!\n");
}
Setupm(h,1024,1024); //输入缓冲区和输出缓冲区大小都是1024
COMMTIMEOUTS TimeOuts;
//设读超时
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetmTimeouts(h,TimeOuts); //设置超时
DCB dcb;
GetmState(h,dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONE5STOPBITS; //两个停止位
SetmState(h,dcb);
DWORD wCount;//读取的节数
BOOL bReadStat;
while(1)
{
Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR); //清缓冲区
char str[9]={0};
printf("%s\n",str);
bReadStat=ReadFile(h,str,9,wCount,NULL);
if(!bReadStat)
{
printf("
怎么通过串口读取51单片机某个地址的数据?请用C语言写出来。
*
授人以鱼,不如授人以渔
*
首先,你要明确在C语中读取内存址是基于指针。
3.比如读取内存地址0x22中的数据
C语言中对于内存的访是基于指,这个毋庸置疑,具体操如下
unsigned int *p= (unsigned int*)0x22 ;//定义针,并且使指针指向了0x22这个 内存地址;
那么*p就是最终你要读取的数据了。
4.至于如何通过串口显示到电脑我就不多了(这不是难点),据你都知道了,写到串口 缓冲区,在串口调试助手下就可以看到。
5.虽然没有贴出具体代码,但这里面的思想可以让你解决
标签:作文经典 上一篇:描写毛毛虫的词语 描写毛毛虫行动的词语 下一篇:成语误用褒贬的例子 褒贬误用的成语
Linux下如何使用c/c++实现检测新增串口,并读取串口号
Linux下面有设文件
串口装好驱动后 会显示在dev下
然后对这个
C语言中如何对串口进行操作
C语言会有操作串口的库函数的,按照串口库数标识实现调
电脑上的串口号是什么意思
串口叫做串行接口,也串行通信接口,按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB等。 RS-232-C、RS-422与RS-485标准对接口的电气特性做出规定,不涉及接插件、电缆或协议。USB是近几年发展起来的新型接口标准,主要应用于速数据传输域。 RS-232-C:也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂共同制定的用于串行通讯的标 准。它的名是“数据终端设备(DTE)和数据通讯设备(DCE)之间 行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座。后来的PC上使用简化了的9芯D插座。现在应用中25芯插头已很少采用。现在的电脑般有两个串行口:COM1和COM2,你到计算机后面能看到9针D形接口就是了。现在有很多手数据线或者物流接收器都采用COM
如何用C语言写一个读、写串口的程序?
大致过程就是
配置串口通信,包串口号、波特、验位、停止位这些信息;
打开串口,和打开文件一样,在Linux是这样,Windows下没试过,估计也差不多;
发送数据,即写串口,就跟写文件类似;
读取
编写单片机串口收发数据的完整程序(C语言编写)
我用的新唐芯片,8051内核,跟51差不多,望采纳
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for tran *** it
P16_Quasi_Mode; //Setting UART pin as Quasi mode for tran *** it
SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
这个是发送
void UART_isr (void) interrupt 4 //
怎样在WINDOWS下用C语言编写串口接收数据程序
#include
#include
int main(void)
{
FILE *fp;
char temp;
char buf[100];
if((fp = fopen("3","r")) == NULL)
puts("this way doesn't work!\n");
else
puts("this way works!\n");
while(1)
{
temp = 0;
fscanf(fp,"%c",temp);
if(temp != 0)
putchar(temp);
else
Sleep(100);
}
fclose(fp);
return 0;
}
以前的,好久看,不知到对不对。
还下面这段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include
#include
HANDLE h;
int main(void)
{
h=CreateFile(TEXT("COM3"),//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是建
0, //同步式
NULL);
if(h==(HANDLE)-1)
{
printf("打开COM失败!\n");
return FALSE;
}
else
{
printf("COM打开成功!\n");
}
Setupm(h,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//定读超时
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetmTimeouts(h,TimeOuts); //设置超时
DCB dcb;
GetmState(h,dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONE5STOPBITS; //两个停止位
SetmState(h,dcb);
DWORD wCount;//读取的字节
BOOL bReadStat;
while(1)
{
Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
char str[9]={0};
printf("%s\n",str);
bReadStat=ReadFile(h,str,9,wCount,NULL);
if(!bReadStat)
{
printf("读串口
标签:作文经典 上一篇:描写毛毛虫的词语 描写毛毛虫行动的词语 下一篇:成语误用褒贬的例子 褒贬误用的成语
sbuf 是51单片机中的串亮旅口数据寄存器,接收和发送用的升启都是它(实际是两敬笑凳个寄存器),
而printf是C语言的库函数,它可以通过串口和并口输出数据,若用串口输出数据,需重新定位fput c()函数,printf调用fput c()函数,fput c()函数调用串口发送命令,最终是操作sbuf 这个寄存器
函数名: strrchr
功 能: 在串中查找指定字森告宴符的最后一个出现
用 法: char *strrchr(char *str, char c);
举例:
[cpp] view plain copy
char fullname="./lib/lib1.so";
char *ptr;
ptr = strrchr(fullname,'/');
printf("filename is %s",++ptr);
//运行结果:filename is lib1.so
函数名: strchr
功 能: 在串中查找指定字符的第一个出现友慎
用 法: char *strchr(char *str, char c);
举例:
[cpp] view plain copy
char fullname="./lib/lib1.so";
char *ptr;
ptr = strrchr(fullname,'.');
printf("after strchr() is %s",++ptr);
//运行结此银果:after strchr() is /lib/lib1.so
函数名: strtok
功 能: 在串中查找指定字符的第一个出现
用 法: char *strtok(char *s, char *delim);
说明:
1.strtok函数的实质上的处理是,strtok在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。这句话有两层含义:(1)每次调用strtok函数只能获得一个分割单位。(2)要获得所有的分割单元必须反复调用strtok函数。
2.strtok函数以后的调用时的需用NULL来替换s.
3.形参s(要分割的字符串)对应的变量应用char s[]=”….”形式,而不能用char *s=”….”形式。
举例:
[cpp] view plain copy
void main()
{
char buf[]=”Golden Global View”;
char* token = strtok( buf, ” “);
while( token != NULL )
{
printf( ”%s “, token );
token = strtok( NULL, ” “);
}
return 0;
}
/*其结果为:
Golden
Global
View
*/
函数名:strncpy
功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中
用法:char *strncpy(char *dest, char *src, int n);
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
举例:
[c-sharp] view plain copy
#include syslib.h
#include string.h
main()
{
char buf[4];
char *s="abcdefg";
strncpy(buf,s,4);
printf("%s/n",buf);
return 0;
}
/*运行结果:
abcd
*/
函数名: stpcpy
功 能: 拷贝一个字符串到另一个
用 法: char *stpcpy(char *destin, char *source);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
stpcpy(string, str1);
printf("%s/n", string);
return 0;
}
/*运行结果
abcdefghi
*/
函数名: strcat
功 能: 字符串拼接函数
用 法: char *strcat(char *destin, char *source);
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char destination[25];
char *blank = " ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
printf("%s/n", destination);
return 0;
}
/*运行结果:
Borland C++
*/
函数名: strcmp
功 能: 串比较
用 法: int strcmp(char *str1, char *str2);
看Asic码,str1str2,返回值 0;两串相等,返回0
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char *buf1 = "aaa", *buf2 = "bbb";
int ptr;
ptr = strcmp(buf2, buf1);
if (ptr 0)
printf("buffer 2 is greater than buffer 1/n");
else if(ptr 0)
printf("buffer 2 is less than buffer 1/n");
else
printf("buffer 2 is equal with buffer 1/n");
return 0;
}
/*运行结果:
buffer 2 is greater than buffer 1
*/
函数名: strncmpi
功 能: 将一个串中的一部分与另一个串比较, 不管大小写
用 法: int strncmpi(char *str1, char *str2, unsigned maxlen);
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char *buf1 = "BBB", *buf2 = "bbb";
int ptr;
ptr = strcmpi(buf2, buf1);
if (ptr 0)
printf("buffer 2 is greater than buffer 1/n");
if (ptr 0)
printf("buffer 2 is less than buffer 1/n");
if (ptr == 0)
printf("buffer 2 equals buffer 1/n");
return 0;
}
函数名: strcspn
功 能: 在串中查找第一个给定字符集内容的段
用 法: int strcspn(char *str1, char *str2);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
#include alloc.h
int main(void)
{
char *string1 = "1234567890";
char *string2 = "747DC8";
int length;
length = strcspn(string1, string2);
printf("Character where strings intersect is at position %d/n", length);
return 0;
}
函数名: strdup
功 能: 将串拷贝到新建的位置处
用 法: char *strdup(char *str);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
#include alloc.h
int main(void)
{
char *dup_str, *string = "abcde";
dup_str = strdup(string);
printf("%s/n", dup_str);
free(dup_str);
return 0;
}
函数名: stricmp
功 能: 以大小写不敏感方式比较两个串
用 法: int stricmp(char *str1, char *str2);
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char *buf1 = "BBB", *buf2 = "bbb";
int ptr;
ptr = stricmp(buf2, buf1);
if (ptr 0)
printf("buffer 2 is greater than buffer 1/n");
if (ptr 0)
printf("buffer 2 is less than buffer 1/n");
if (ptr == 0)
printf("buffer 2 equals buffer 1/n");
return 0;
}
函数名: strerror
功 能: 返回指向错误信息字符串的指针
用 法: char *strerror(int errnum);
举例:
[cpp] view plain copy
#include stdio.h
#include errno.h
int main(void)
{
char *buffer;
buffer = strerror(errno);
printf("Error: %s/n", buffer);
return 0;
}
函数名: strncmp
功 能: 串比较
用 法: int strncmp(char *str1, char *str2, int maxlen);
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char *buf1 = "aaabbb", *buf2 = "bbbccc", *buf3 = "ccc";
int ptr;
ptr = strncmp(buf2,buf1,3);
if (ptr 0)
printf("buffer 2 is greater than buffer 1/n");
else
printf("buffer 2 is less than buffer 1/n");
ptr = strncmp(buf2,buf3,3);
if (ptr 0)
printf("buffer 2 is greater than buffer 3/n");
else
printf("buffer 2 is less than buffer 3/n");
return(0);
}
函数名: strncmpi
功 能: 把串中的一部分与另一串中的一部分比较, 不管大小写
用 法: int strncmpi(char *str1, char *str2, int len);
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char *buf1 = "BBBccc", *buf2 = "bbbccc";
int ptr;
ptr = strncmpi(buf2,buf1,3);
if (ptr 0)
printf("buffer 2 is greater than buffer 1/n");
if (ptr 0)
printf("buffer 2 is less than buffer 1/n");
if (ptr == 0)
printf("buffer 2 equals buffer 1/n");
return 0;
}
函数名: strnset
功 能: 将一个串中的所有字符都设为指定字符
用 法: char *strnset(char *str, char ch, unsigned n);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
int main(void)
{
char *string = "abcdefghijklmnopqrstuvwxyz";
char letter = 'x';
printf("string before strnset: %s/n", string);
strnset(string, letter, 13);
printf("string after strnset: %s/n", string);
return 0;
}
函数名: strpbrk
功 能: 在串中查找给定字符集中的字符
用 法: char *strpbrk(char *str1, char *str2);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
int main(void)
{
char *string1 = "abcdefghijklmnopqrstuvwxyz";
char *string2 = "onm";
char *ptr;
ptr = strpbrk(string1, string2);
if (ptr)
printf("strpbrk found first character: %c/n", *ptr);
else
printf("strpbrk didn't find character in set/n");
return 0;
}
函数名: strrev
功 能: 串倒转
用 法: char *strrev(char *str);
举例:
[cpp] view plain copy
#include string.h
#include stdio.h
int main(void)
{
char *forward = "string";
printf("Before strrev(): %s/n", forward);
strrev(forward);
printf("After strrev(): %s/n", forward);
return 0;
}
/*运行结果:
Before strrev(): string
After strrev(): gnirts
*/
函数名: strstr
功 能: 在串中查找指定字符串的第一次出现
用 法: char *strstr(char *str1, char *str2);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
int main(void)
{
char *str1 = "Borland International", *str2 = "nation", *ptr;
ptr = strstr(str1, str2);
printf("The substring is: %s/n", ptr);
return 0;
}
函数名: strtod
功 能: 将字符串转换为double型值
用 法: double strtod(char *str, char **endptr);
举例:
[cpp] view plain copy
#include stdio.h
#include stdlib.h
int main(void)
{
char input[80], *endptr;
double value;
printf("Enter a floating point number:");
gets(input);
value = strtod(input, endptr);
printf("The string is %s the number is %lf/n", input, value);
return 0;
}
函数名: strtol
功 能: 将串转换为长整数
用 法: long strtol(char *str, char **endptr, int base);
举例:
[cpp] view plain copy
#include stdlib.h
#include stdio.h
int main(void)
{
char *string = "87654321", *endptr;
long lnumber;
/* strtol converts string to long integer */
lnumber = strtol(string, endptr, 10);
printf("string = %s long = %ld/n", string, lnumber);
return 0;
}
函数名: strupr
功 能: 将串中的小写字母转换为大写字母
用 法: char *strupr(char *str);
举例:
[cpp] view plain copy
#include stdio.h
#include string.h
int main(void)
{
char *string = "abcdefghijklmnopqrstuvwxyz", *ptr;
/* converts string to upper case characters */
ptr = strupr(string);
printf("%s/n", ptr);
return 0;
}
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款