搜索
bottom↓
回复: 86

开源:基于Visual Studio2005、ATmega48的串口编程

[复制链接]

出0入0汤圆

发表于 2008-8-2 00:51:09 | 显示全部楼层 |阅读模式
从来没有搞过上位机的编程,好像有人说过,搞单片机的不搞串口就不。。。如今更是发展到USB。。。像我等只学了一点点东西的人如果不及时更新自己的技术,还能生活吗?反正技术是一代一代更新,层出不穷。

在我看来,没有攻克不了的难关,只要你去努力,只要你不去放弃,你就能搞定,搞定后你再回头看:不过如此!

从学单片机到现在,各种辛酸只有自己知道,多少个不眠夜,梦中都在想问题!如今大大小小的项目也做了几个,不敢说掌握我想应该是入门了吧!

工作中,学习中,跟计算机的通讯越发变得重要起来,报了个C++ 的学习_班,MFC都讲了3节课了,还是如同腾云驾雾,总会好起来的,我想!只要努力。。。只要努力。。。

好了,废话了那么多,下面该说点正事了;

还是要说点别的,经常在论坛看到有人提问,windows串口的编程,老鸟们就不用看了,我搞了很久才搞出来,选工具都选了好几个,先用的是C++ builder,说句实话,它的VCL库用起来真的是很号,封装的很人性化,做界面很容易,几乎就是一拖一拉,然后就是一通的设置属性,我用这个也做了串口出来,是纯调用windowsAPI函数,(我会在后面把这个也开源了)很累!

有人说这里可以安装一个ActiveX控件,很烦,我装了好几次就是装不上!或许是我笨吧!
后来发现Viusal Studio2005里有一个SerialPort组件,于是就痛下决心用这个做了,这次废话真的完了。

或许我的这点东西发出来并不能给聪明的你有什么帮助,但是对像我这样菜鸟级的,或许还是有一点帮助吧!

在这个例子里,我会一步一步做下去,最简单,最明了的做法,一些不会上位机编程的鸟们看完就应该能搞了!

基础知识:C
          C++
          CLI/C++(一点)
          AVR mega单片机原理
          电子知识(一些)
          计算机基本操作。。。^ _^
软件环境:Viusal Studio2005
        Winavr
        AVR Studio4

硬件环境:带串口的电脑(或同等的USB转串口线)
          AVR mega48实验电路(电路后面有附)
          后面我会附带一张USB转串口的图纸,希望对用本本的鸟们有些帮助


上一张原理图:虽然简单,但是我们还是要在这个上面做实验的,毕竟这是我们的结果!

点击此处下载 ourdev_366073.pdf(文件大小:15K) (原文件名:M48.pdf)


准备一下 待续。。。



继续。。。


还是从上位机说起吧,毕竟下位机太简单,或许你看到就看不下去了,因为单片机的编程,你比我还厉害!!!

你老就当作消遣吧!

说起visual studio 2005真是激动人心,华丽的界面,全面支持C99标准的C++ 语言环境,完善的MSDN帮助环境,最主要的是:大部分都是中文的,虽然C++的例子很少。

还在用朴素的VC6.0 吗?该换了!

启动后的部分截图:



(原文件名:1.JPG)

出0入22汤圆

发表于 2008-8-2 00:58:08 | 显示全部楼层
顶一个。

出0入0汤圆

发表于 2008-8-2 01:01:50 | 显示全部楼层
SerialPort是.net framework 2.0里面的CLR?没用过。
不安装VC6用MSCOMM32.OCX在龚建伟的网站上有。

出0入0汤圆

发表于 2008-8-2 01:31:31 | 显示全部楼层
顶一个,楼主是用vs2005的C++么?偶喜欢那个C#。

出0入46汤圆

发表于 2008-8-2 08:58:22 | 显示全部楼层

出0入0汤圆

发表于 2008-8-2 09:57:14 | 显示全部楼层
等楼主继续,谢谢

出0入0汤圆

发表于 2008-8-2 10:26:18 | 显示全部楼层
等。。。。。

出0入0汤圆

发表于 2008-8-2 18:29:01 | 显示全部楼层
继续等!

出0入0汤圆

 楼主| 发表于 2008-8-4 11:00:33 | 显示全部楼层
接着来。。。

选择文件---新建---项目----展开Visual C++ ---选择CLR-----再选择右边的“windows窗体应用程序”

在下面为我们的工程起个名字“TestColor”并选择好存放的位置,点击“确定”!

如图:

(原文件名:新建工程.JPG)

这样,我们的工程就建好了,弹出如下界面:


(原文件名:启动.JPG)

熟悉吗?很像C++ builder吧,呵呵!

下面我们要做一系列的设置

右击窗体,选择属性

在属性栏里找到“TEXT”属性,将“Form1”更改成我们想要的“TestColor”更改后我们马上就能看到窗体的标题栏里的字符改变了,很简单,不是吗?这里有很多可以设置的,聪明的你一定很快就能适应这种方式!

我们要在这个空白的窗口上放置我们自己的组件。点击右侧边的工具栏,会弹出工具栏,如果你的计算机没有弹出这个工具栏,请依次点击,视图—工具栏,结果如下:


(原文件名:工具箱.JPG)

在工具栏上找到Button组件,单击,移动鼠标至窗口上并单击,窗口上将出现一个按钮。

默认名是“button1”右击选择属性,
NAME属性改成“Open”:name属性是我们在程序里引用的,以后我们对这个按钮所有的操作都将用这个名字来引用它
Text属性修改成“&Open”:看见那个“&”符号了吗?这个符号的作用就是产生一个热键,我们能即时的看到修改后的结果,&的符号并没有在按钮上出现,代替它的是O的字母下面的一个下划线,热键就是这样设置的,很简单,不是吗?

我们需要四个按钮组件,分别是:Open,Close,About,Exit

如法炮制。。。

放置4个按钮后的界面如下:


(原文件名:按钮.JPG)

出0入0汤圆

发表于 2008-8-4 11:03:52 | 显示全部楼层
呵呵,支持下,我当初用的是C#开发的串口通讯类,到时可以讨论下~~

出0入0汤圆

 楼主| 发表于 2008-8-5 23:28:25 | 显示全部楼层
接着来:


放置3个tackbar组件:

工具箱里取tackbar组件

设置属性:Orientation:vertical
                  Tickstyle:both
          Name:Rset,Gset,Bset
          Maximum:255
          TickFrequency:5


调整合适大小,如图:


(原文件名:RGB设置.JPG)



放置3个 NumbericUpDown组件

设置属性:Tickstyle:both
          Name:Rval,Gval,Bval
Backcolor:red,green,blue
TextAlign:Center
          Maximum:255


调整合适大小,效果如图:


(原文件名:rgbval.JPG)


放置1个panel组件

设置属性:Name:ColorShow
Backcolor:Black

放置后的效果如图:


(原文件名:colorshow.JPG)

放置1个label组件

设置属性:TEXT:颜色预览

设置后的效果如图:


(原文件名:颜色预览.JPG)

放置1个GroupBox组件

设置属性:Name:SelectPort
        Text:SelectPort


调整大小位置后如图:


(原文件名:selectport.JPG)

在groupbox组件上放置5个RadioButton组件

设置属性:name:comm1--------comm5

          Text:COM1-------------COM5


                唯独comm1的Checked属性我们设置成True,为的是我们的程序运行后有个默认

的端口选择


调整位置后效果如图:


(原文件名:comm.JPG)


下面放置我们的关键部件:

1个SerialPort组件,1个Timer组件

设置Serialport属性:Name:WCOMM

设置Time属性:Name:timer1
               Enabled:False
               Interval:100


这两个组件运行时是不可见的,所以,我们无需调整他们的位置,大小(关键是我们调整不了,呵呵)

放置后的效果如图:


(原文件名:timer.JPG)


Ok,到目前为止,我们所有的界面组件都添加完成了,基本上,这个界面也能实现我们所要的功能了

点击菜单“生成”-----生成TestColor,我们的项目就编译了,没有错误,除非你没跟着做,如果有错误,就返回去看看哪步做错了


也许你找不到生成这个选项,那么请你查找是否有个“重新生成解决方案”,基本上就是编译的意思。

然后再点击“调试”---“开始执行(不调试)”选项

我们的程序界面就出来了,如图:


(原文件名:yunxing.JPG)

神奇吗?就这么简单我们的界面就做成功了,而所有的这些,是在我们没有编写一句代码的情况下完成的。


呵呵,休息一下,我们开始我们的重头戏:编写代码,实现他们该实现的功能

出0入0汤圆

 楼主| 发表于 2008-8-6 13:59:29 | 显示全部楼层
看来鸟们是真的不屑啊

出0入0汤圆

发表于 2008-8-6 14:22:18 | 显示全部楼层
哈,没有不屑吧?只是等的时间有点长哦~~

出0入0汤圆

发表于 2008-8-6 14:38:42 | 显示全部楼层
我天天关注你的帖子呢,可是时间间隔太长了呀。就等着跟你学了!

出0入0汤圆

发表于 2008-8-7 00:40:31 | 显示全部楼层
不错啦,现在的VC++2005,不用MFC这种麻烦东西了。

出0入22汤圆

发表于 2008-8-7 00:59:16 | 显示全部楼层
可惜啊,我还停留在98的阶段。vb98

出0入0汤圆

 楼主| 发表于 2008-8-7 23:22:25 | 显示全部楼层
这两天跟打仗一样,实在是很无奈!昨天一直搞到现在,实在是搞不动了,睡觉先,明天更新!

出0入0汤圆

发表于 2008-8-8 09:56:35 | 显示全部楼层
学习中!

出0入0汤圆

发表于 2008-8-11 08:41:15 | 显示全部楼层
楼主怎么还不更新!!

出0入0汤圆

发表于 2008-8-11 09:23:14 | 显示全部楼层
等楼主醒来!

出0入0汤圆

发表于 2008-8-15 08:33:21 | 显示全部楼层
楼主看奥运的同时要更新啊!!!

出0入0汤圆

发表于 2008-8-15 08:56:01 | 显示全部楼层
楼主,你要雄起啊!中国金牌第一啊!

出0入0汤圆

发表于 2008-8-15 09:13:42 | 显示全部楼层
老大,等你!加油啊!我深重的敬仰你!更新吧。。。

出0入0汤圆

发表于 2008-8-16 15:00:49 | 显示全部楼层
楼主更新啊。。。。

出0入0汤圆

发表于 2008-8-18 11:55:53 | 显示全部楼层
顶贴,楼主何在?

出0入0汤圆

发表于 2008-8-18 14:26:30 | 显示全部楼层
楼主,你更新太慢了!!!

出0入0汤圆

 楼主| 发表于 2008-8-18 20:40:12 | 显示全部楼层
实在是不好意思,搞了个充电器,昨天晚上才弄好,真是太累了,用的是holtek的单片机,简单,用起来还可以!

出0入0汤圆

 楼主| 发表于 2008-8-18 20:57:39 | 显示全部楼层
首先我们要实现颜色预览功能,和数字编辑框里的值写好,实现这些功能的代码是超级简单!不信,你看。。。


双击滑块 Rset 弹出代码编辑页:输入如下代码:

(有部分代码系统自动生成输入,请仔细对照部分代码)


private: System::Void Rset_Scroll(System::Object^  sender, System::EventArgs^  e) {
                                 Rval->Value = Rset->Value;
                                 Color pcolor;
                                 ColorShow->BackColor = pcolor.FromArgb(Rset->Value,Gset->Value,Bset->Value);
                         }                         }


双击滑块 Gset 弹出代码编辑页:输入如下代码:


private: System::Void Gset_Scroll(System::Object^  sender, System::EventArgs^  e) {
                         Gval->Value = Gset->Value;
                         Color pcolor;
                         ColorShow->BackColor = pcolor.FromArgb(Rset->Value,Gset->Value,Bset->Value);
                 }


双击滑块 Gset 弹出代码编辑页:输入如下代码:


private: System::Void Bset_Scroll(System::Object^  sender, System::EventArgs^  e) {
                         Bval->Value = Bset->Value;
                 Color pcolor;
                 ColorShow->BackColor = pcolor.FromArgb(Rset->Value,Gset->Value,Bset->Value);
                 }


代码编辑完成保存,生成解决方案,运行:



(原文件名:colorshowok.JPG)

出0入0汤圆

 楼主| 发表于 2008-8-18 21:26:41 | 显示全部楼层
下面我们完成按钮的功能,双击Open 按钮,添加以下代码:

private: System::Void Open_Click(System::Object^  sender, System::EventArgs^  e) {
if(comm1->Checked == true)
                         {
                                 System::String^  port = "COM1";
                                 WCOMM->PortName::set(port);                                 
                         }
                         else if(comm2->Checked == true)
                         {

                                 System::String^  port = "COM2";
                                 WCOMM->PortName::set(port);                               
                         }
                         else if(comm3->Checked == true)
                         {
                                 System::String^  port = "COM3";
                                 WCOMM->PortName::set(port);       
                         }
                         else if(comm4->Checked == true)
                         {

                                 System::String^  port = "COM4";
                                 WCOMM->PortName::set(port);       
                         }
                         else if(comm5->Checked == true)
                         {

                                 System::String^  port = "COM5";
                                 WCOMM->PortName::set(port);       
                         }

                         WCOMM->Open();//打开串口
                         timer1->Enabled=true;//开启定时器
}

双击Close 按钮,添加以下代码:

private: System::Void Close_Click(System::Object^  sender, System::EventArgs^  e) {
                         timer1->Enabled=false;        //关闭定时器
                         WCOMM->Close();        //关闭串口
                 }


双击Exit 按钮,添加以下代码:


private: System::Void Exit_Click(System::Object^  sender, System::EventArgs^  e) {
                         timer1->Enabled=false;
                         WCOMM->Close();
                         Application::Exit();        //退出程序
                 }


下面我们要为我们的小软件添加我们自己的信息,毕竟是我们自己写的嘛,尽管写得不好,留下点什么也是应该的吧,呵呵!

虽然实现的方式有些笨拙,达到目的就行了

双击About 按钮,添加以下代码:

private: System::Void About_Click(System::Object^  sender, System::EventArgs^  e) {
                         MessageBox::Show("mu.blank@gmail.com",
                                 "About", MessageBoxButtons::OKCancel
                                 /*MessageBoxIcon::Asterisk*/);

                 }


到此四个按钮的功能我们也完成了,下面我们要实现我们最终的目的,将3个变量的值发送出去,这个功能我们放在定时器的事件里,记得我们把定时器的Interval属性设置成100 了吗?这个单位是ms 100就说明是100ms会产生一个定时器事件,怎么样?比AVR的定时器方便多了吧?不要指望这个事件有多准确,实际上它是非常不准的,有兴趣的可以测试下,不过根据系统的不同可能差异也不同,但是也不会差多少,对于我们这个小东西,够了!

双击定时器timer1,添加以下代码:

private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
                         array<Byte> ^ pppbyte = gcnew array<Byte>{Rset->Value,Gset->Value,Bset->Value}; /*在可回收栈上声明并初始化一个数组gcnew相当于c++中的new,在c++中我们new出来后我们还要负责将这个数组deletel,用gcnew就不用,所有的工作,编译器帮你做了,这个是c++ CLI语法!内部一个垃圾回收站*/
                         WCOMM->Write(pppbyte,0,3);//发送3个字节的数据
                 }


如果你全部都照做了,那这个程序也就写好了,可是我要说的是,我们只做了一个程序的80%,还有20%我们没有完成

如果你想让你的这个程序在任何电脑上都能跑的话,那么你还需要学会怎样制作安装程序,怎样包含运行我们这个程序所需要的micosoft .NET Fromwork

休息一下,我将带领大家解开制作安装程序的秘密(有了VS2005 ,一切变得同样“超级简单”)!让我们的程序也像模像样!

出0入0汤圆

发表于 2008-8-18 22:52:52 | 显示全部楼层
不错,好贴,顶一下!

出0入0汤圆

发表于 2008-8-19 07:19:45 | 显示全部楼层
vs2005在偶的老机上跑步动,现在用2003,不过2005完整版很好用的,另一个免费的就有点...

出0入0汤圆

发表于 2008-8-19 08:48:47 | 显示全部楼层
学习中!!!

出0入0汤圆

发表于 2008-8-19 09:55:34 | 显示全部楼层
支持楼主继续呀!!!

出0入0汤圆

发表于 2008-8-19 15:01:02 | 显示全部楼层
感谢楼主,我就需要这样的教程,刚刚开始的时候我连serialport的控件都找不到。。。

出0入0汤圆

发表于 2008-8-19 16:13:52 | 显示全部楼层
楼主辛苦了~!感谢~!

出0入0汤圆

发表于 2008-8-19 17:02:43 | 显示全部楼层
用C#写的软件好象比较耗资源,启动也比较慢,是不是这么回事啊!C#安装完成后占了好几个G的空间.

出0入0汤圆

发表于 2008-8-19 18:25:43 | 显示全部楼层
头像被屏蔽

出0入0汤圆

发表于 2008-8-19 18:30:52 | 显示全部楼层
支持。COOL !

出0入0汤圆

发表于 2008-8-19 23:03:04 | 显示全部楼层
继续继续,期待中!

出0入0汤圆

 楼主| 发表于 2008-8-20 00:38:23 | 显示全部楼层
我也不知道我用的是哪个版本,免费版还是完整版?真的不知道,不过能用就好!

工作闲暇时才能更新,大家别急,马上就要更新了

出0入0汤圆

发表于 2008-8-20 01:29:06 | 显示全部楼层
SerialPort、Timer 这些东西,如果写成服务都是无法使用的,还是直接 Imports System.IO.Ports 来使用 System.IO.Ports.SerialPort() 比较好,在什么地方都能用。定时器也是,直接 Imports 那个 System.Timers.Timer() 才不会失效...

出0入0汤圆

发表于 2008-8-20 07:30:02 | 显示全部楼层
期待中...

出0入0汤圆

发表于 2008-8-20 08:31:06 | 显示全部楼层
好贴占座学习...

出0入0汤圆

发表于 2008-8-20 09:05:28 | 显示全部楼层
学习!

出0入0汤圆

发表于 2008-8-20 09:52:07 | 显示全部楼层
哥们,传一下你作品最后的照片,别弄得像开课讲VC++好不好.

出0入0汤圆

 楼主| 发表于 2008-8-20 10:48:39 | 显示全部楼层
楼上,不好意思,我是边做边写的,最后的照片还没有拍出来,另外,没有什么最后的照片,因为上面我们已经写好了整个界面,甚至功能我们也写好了,下面我要说的是怎样制作安装程序

出0入0汤圆

 楼主| 发表于 2008-8-20 10:51:35 | 显示全部楼层
40楼,我们在发布的时候包含必要的运行库就能解决你说的问题,此问题我已经在N台电脑上实验过,没有一台计算机出现不能使用的情况!

出0入0汤圆

发表于 2008-8-22 12:23:03 | 显示全部楼层
下文呢?

出0入0汤圆

发表于 2008-8-22 21:18:57 | 显示全部楼层
楼主,我说的不是运行库的问题,而是指如果需要用 Local Service 身份而不是用户身份执行的话似乎是无效的,这也是 .net 2.0 引入 SerialPort 类后我发现的一个问题。

出0入0汤圆

发表于 2008-8-22 23:23:46 | 显示全部楼层
支持,等。

出0入0汤圆

发表于 2008-8-25 09:34:00 | 显示全部楼层
以上操作以完成,期待更新。。。楼主厉害啊!

出0入0汤圆

发表于 2008-8-25 10:31:14 | 显示全部楼层
标记

出0入0汤圆

发表于 2008-8-28 20:30:55 | 显示全部楼层
难道没有下文了???

出0入0汤圆

发表于 2008-8-28 22:00:20 | 显示全部楼层
好!

出0入0汤圆

发表于 2008-8-29 22:23:37 | 显示全部楼层
顶啊

出0入0汤圆

发表于 2008-8-29 22:29:11 | 显示全部楼层
期待中...

出0入0汤圆

发表于 2008-8-31 22:33:42 | 显示全部楼层
等10天了~

出0入0汤圆

 楼主| 发表于 2008-9-2 00:17:41 | 显示全部楼层
不好意思,一直在赶一个项目啊,我也要吃饭不是?还有,我家即将添丁了!我要做爸爸了!同志们帮我兴奋一下吧!

出0入0汤圆

发表于 2008-9-2 07:16:01 | 显示全部楼层
不错,有时间看看

出0入0汤圆

发表于 2008-9-2 08:25:40 | 显示全部楼层
恭喜楼主!!

出0入0汤圆

发表于 2008-9-2 09:13:35 | 显示全部楼层
Good,恭喜

出0入0汤圆

发表于 2008-9-2 11:27:18 | 显示全部楼层
恭喜!恭喜!

出0入0汤圆

 楼主| 发表于 2008-9-2 15:06:23 | 显示全部楼层
同喜同喜!

出0入0汤圆

发表于 2008-9-4 22:16:13 | 显示全部楼层
恭喜恭喜,。。。继续等。

出0入0汤圆

 楼主| 发表于 2008-9-8 19:16:57 | 显示全部楼层
生了,七斤九两,带把的,不敢耽搁,马上电话拨号上网告诉各位,哈哈!

拨号上网,痛苦啊!!!

出0入0汤圆

发表于 2008-9-8 23:20:09 | 显示全部楼层
恭喜恭喜~~

出0入0汤圆

发表于 2009-2-18 20:47:04 | 显示全部楼层
好帖!!!!!!!!!!!!!!1

出0入0汤圆

发表于 2009-10-13 13:58:12 | 显示全部楼层
后面更新的在那里啊? 很想看下 我也是初学者看了这个 比看别人有用多了 能明白  谢谢楼主

出0入0汤圆

发表于 2009-11-28 10:42:33 | 显示全部楼层
不错

出0入0汤圆

发表于 2009-11-28 19:34:45 | 显示全部楼层
我最近也在写一个上位机,用VB2005的,可是一直苦于没有人交流,希望楼主能指导一下

出0入0汤圆

发表于 2010-8-28 23:56:56 | 显示全部楼层
怎么没有下文了!

出0入0汤圆

发表于 2010-10-21 23:15:55 | 显示全部楼层
先mark

出0入0汤圆

发表于 2010-10-21 23:29:35 | 显示全部楼层
恭喜 恭喜

出0入0汤圆

发表于 2010-11-29 17:31:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-1 14:09:27 | 显示全部楼层
没事过来mark先。

出0入0汤圆

发表于 2010-12-1 14:37:58 | 显示全部楼层
楼主好耐心

出0入0汤圆

发表于 2010-12-2 19:54:52 | 显示全部楼层
学习...

出0入0汤圆

发表于 2010-12-2 20:42:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-2 21:04:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-2 22:09:46 | 显示全部楼层
serialPort类极不稳定,尤其是用USB转232口,如果通讯断掉,程序立即死掉,这个问题微软尚无法解决,玩玩可以,千万不能做产品。

出0入0汤圆

发表于 2012-3-2 00:24:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-3 16:49:45 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-3-3 16:55:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-2-20 16:12:46 | 显示全部楼层
楼主怎不来贴继续讲课呢

出0入0汤圆

发表于 2015-6-4 16:14:44 | 显示全部楼层
楼主,时隔这么多年了,让后辈们看到这个帖子有点淡淡的失落,咋地不更新完呢

出0入0汤圆

发表于 2015-6-12 16:28:51 | 显示全部楼层
作者搞不好是早忘了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 05:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表