Nokia论坛技术资料Symbian解决方案-中文版(8)-转载

如何切换程序UI方向为横屏或竖屏

详细描述:
缺省情况下,程序是根据手机屏幕的当前方向开始启动的。如果要强制程序以横屏或竖屏的模式启动,那我们在CAknAppUi::ConstructL()方法中调用BaseConstructL()时就要传递相应的flag值:

Code:
    void CMyAppUi::ConstructL()          {            BaseConstructL( EAknEnableSkin | EAppOrientationLandscape );    // start in landscape mode            ...            }


如果要在程序运行期间改变方向,则需要调用:

Code:
    void CAknAppUiBase::SetOrientationL( TAppUiOrientation aOrientation );

这里的参数为EAppUiOrientationLandscape和EAppUiOrientationPortrait,注意这种情况下的调用就不要再向BaseConstructL()中传递相同的参数了。

使用UserSvr::ScreenInfo()获取显示内存的方法在S60第三版中已经废弃

详细描述
通过调用UserSvr::ScreenInfo()获得TScreenInfoV01::iScreenAddress地址,可以直接在显示器的帧缓冲进行绘制,在修改完帧缓冲后,显示器需要强制来更新一下。

在S60第三版之前,我们可以通过如下方式进行重绘:

Code:
TRawEvent redraw;    redraw.Set( TRawEvent::ERedraw );    UserSvr::AddEvent( redraw );

在S60第三版上,这个方法就无法立即生效了。屏幕只在街道数据超过范围的通知时才被更新。

解决方案
开发者可以使用CDirectScreenBitmap类进行屏幕直接访问,从而取代通过UserSvr::ScreenInfo()来获取帧缓冲的方法。要获取更多信息,可以参考文档
S60 Platform: Scalable Screen-Drawing How-To
http://www.forum.nokia.com/info/sw.n..._0_en.pdf.html

另一种解决方案是,仍然使用老的绘制方法,并通过指定数据超过范围以强制更新屏幕

Code:
void CFbsScreenDevice::Update( const TRegion &aRegion );

如何在第三版FP1中设置/获取手机铃声

概述
在S60第三版FP1中可以通过Profile Engine Wrapper API设置/获取手机铃声


获取铃声的解决方案
首先需要ProfileEngine.lib库。

需要的头文件是: mproengengine.h, proengfactory.h, mproengprofile.h, mproengtones.h

Code:
MProEngEngine* engine = ProEngFactory::NewEngineL();    CleanupReleasePushL(*engine);    MProEngProfile* activeProfile = engine->ActiveProfileL();    CleanupReleasePushL(*activeProfile);    MProEngTones& tones = activeProfile->ProfileTones();    // the ringing tone file name can be retrieved from calling tones.RingingTone1();     CleanupStack::PopAndDestroy(2);


修改铃声的解决方案
首先需要ProfileEngine.lib库。

需要的头文件是: mproengengine.h, proengfactory.h, mproengprofile.h, mproengtones.h

Code:
MProEngEngine* engine = ProEngFactory::NewEngineL();    CleanupReleasePushL(*engine);    MProEngProfile* activeProfile = engine->ActiveProfileL();    CleanupReleasePushL(*activeProfile);    MProEngTones& tones = activeProfile->ProfileTones();    _LIT( KToneName, "C:\\Data\\Sounds\\Digital\\Superman.mp3" );    TInt error = tones.SetRingingTone1L(KToneName);    activeProfile->CommitChangeL();    CleanupStack::PopAndDestroy(2);

如何在S60第三版FP1上设置情景模式

概述
可以用过Profile Engine Wrapper API来设置情景模式

解决方案
下列这段示例代码演示了如何设置当前情景模式为静音。
需要在mmp文件中添加链接库ProfileEngine.lib
需要包含的头文件有 mproengengine.h, proengfactory.h, profile.hrh

Code:
MProEngEngine* engine = ProEngFactory::NewEngineL();    CleanupReleasePushL(*engine);    engine->SetActiveProfileL(EProfileSilentId);    CleanupStack::PopAndDestroy(1);

根据显示模式选择正确的配置信息

详细描述:
自从手机支持不同的显示模式后,我们为当前使用的显示模式选择一个适当的EGL帧缓冲就显得尤为重要了。

举例来说,假设目前显示模式为EColor64K,EColor64K显示模式使用的RGBA5650格式,也就是说,每个像素16bit,红色5位,蓝色6位,绿色5位,Alpha透明0位。

如下代码所示,检查一下当前显示模式,然后选择帧缓冲:

Code:
TDisplayMode mode = Window().DisplayMode();    TInt BufferSize = 0;    switch(mode)  {    case( EColor64K ):       BufferSize = 16;       break;       ...  }



根据相面属性选择适当配置信息:

Code:
    const EGLint attrib_list[] =            {            EGL_SURFACE_TYPE,   EGL_PBUFFER_BIT,            EGL_BUFFER_SIZE,    BufferSize,            EGL_RED_SIZE,       5,            EGL_GREEN_SIZE,     6,            EGL_BLUE_SIZE,      5,            EGL_ALPHA_SIZE,     0,            EGL_DEPTH_SIZE,     EGL_NONE            };


然后使用:

Code:
eglChooseConfig( iEglDisplay, attrib_list, configList, configSize, &numOfConfigs );


可能会返回RGBA8880配置信息,因为结果是被过滤过的,其属性可能等于或大于请求值。如果configList中第一个配置信息被选中,结果可能和当前显示模式不匹配,这种情况下,绘制将会发生错误,导致空白屏幕出现。


解决方案:
使用下列代码来过滤返回的配置信息列表:

Code:
for ( TInt i = 0; i < numOfConfigs; i++ )            {            EGLint red, green, blue, alpha;            eglGetConfigAttrib( iEglDisplay, configList[i], EGL_RED_SIZE, &red );            eglGetConfigAttrib( iEglDisplay, configList[i], EGL_GREEN_SIZE, &green );            eglGetConfigAttrib( iEglDisplay, configList[i], EGL_BLUE_SIZE, &blue );            eglGetConfigAttrib( iEglDisplay, configList[i], EGL_ALPHA_SIZE, &alpha );                        if ( red == 5 && green == 6 && blue == 5 && alpha == 0 )                {                iSelectedConfig = configList[i];                break;                }            }

如何获取正在运行任务的列表

详细描述:
描述
Symbian操作系统的应用程序框架提供了一组API用以获得当前正在运行的任务的信息(无论其在前台或后台运行)。


解决方案
我们可以使用TApaTaskList获取当前正在运行的任务的列表。具体任务是通过正在运行的程序window group来识别的,在构造TApaTaskList时我们需要将window server的session作为参数传递进去。

Code:
#include <apgtask.h>    // link against apgrfx.lib        TApaTaskList tasklist(CCoeEnv::Static()->WsSession());        TApaTask taskInForeground = tasklist.FindByPos( 0 );        // Window Group ID of the foreground task        TInt WindowGroupIdentifier = taskInForeground.WgId();        // Thread ID of the foreground task        TThreadId ThreadIdentifier = taskInForeground.ThreadId();


TApaTaskList中第一个任务是在前台运行的那个(相关的window group位置顺序是从0开始的)

TApaTask包括很多与task相关的有用信息,如线程标识(ThreadId())以及window group标识(WgId()).

此外,还有一些有用的函数方法,如EndTask(),用来请求某任务正常关闭,以及KillTask()用来直接中止某任务。

SendToBackground()以及BringToForeground()方法可以用来控制程序在任务列表中的位置。

如何在S60第二版FP2设备上获取当前网络信息

描述
CTelephony API从S60第二版FP3后才开始支持,尽管API(etel3rdparty.h)在S60第二版FP2 SDK中已经出现,但还没有被真机所支持(Nokia 6630, Nokia 6680)


解决方案
Symbian提供了一个Mobinfo第三方电话库给所有基于Symbian OS v7.0, v7.0s, v8.0a, and v8.1a的手机使用,有了它,第三方可以获得如下信息:

* IMEI, IMSI和自己的电话号码
* 网络可用性以及变更通知
* 网络和本地标识
* 电池和信号强度的通知

Mobinfo作为一个公开的,重新发布的库,可以在这里下载到 http://developer.symbian.com/main/to.../cpp/index.jsp

要使用其API,你需要利用到两个头文件(mobileinfo.h, mobinfotypes.h),以及mobinfo.dll库

Mobinfo API包含三个主要的类:

Code:
CMobileInfo    CMobileNetworkInfo    CMobileContext

Mobinfo提供的异步方法调用是基于活动对象完成的。


举例说明,如何获取当前网络信号:

Code:
 CMobileNetworkInfo::GetCurrentNetwork( TMobileNetwork& aMobNetInfo, TRequestStatus& aStatus );

GetCurrentNetwork 将返回当前设备登记所在的网络信息。aStatus在飞行模式下将会返回KErrAccessDenied。

如何在S60第三版中通过程序启动MIDlets

描述
当安装一个MIDlet程序到S60第三版手机上时,将会被分配一个MIDlet-Suite UID和一个MIDlet-specific UID,这两个都是在安装时生成的。MIDlet的文件将被放置在

Code:
\private\102033E6\MIDlets\[MIDlet Suite UID]

因为MIDlet文件被放置在私有目录中,因此无法直接访问他们。为MIDlet生成的入口在已安装程序列表中还是有的。这个列表是由application architecture server来管理的,可以通过RApaLsSession类的方法来读取。

列表中每个MIDlet入口在应用程序执行名称中都有一个".fakeapp"后缀,这个信息可用以在扫描列表时区分MIDlet和其他程序,为了从代码中启动MIDlet程序,其MIDlet-specific UID要被使用。

解决方案
下列示例代码演示了如何搜索所有安装的MIDlet程序:

Code:
//------------------------------------------------------------------------------        TApaAppInfo appInfo;        RApaLsSession apaSession;        User::LeaveIfError( apaSession.Connect() );        CleanupClosePushL( apaSession );        User::LeaveIfError( apaSession.GetAllApps() );                    while ( apaSession.GetNextApp( appInfo ) == KErrNone )        {        if(appInfo.iFullName.Right(8).Compare(_L(".fakeapp") == 0)        {        // Caption of the MIDlet can be read from appInfo.iCaption        // When the MIDlet to be launch is found, store its UID         // (appInfo.iUid) for later use.        }        }                CleanupStack::PopAndDestroy(); // close apaSession    //------------------------------------------------------------------------------


启动MIDlet
当MIDlet程序的UID被获知后,就可以通过如下语句来启动:

Code:
TThreadId threadId;  apaSession.StartDocument(_L(""), iMidletUID, threadId);

一个空的描述符将被作为第一个参数传入(文件名称)。

如果启动程序期望监测该MIDlet程序,以便在其关闭时收到一个通知,则可以从CActive派生,并调用RThread::Logon():

Code:
TInt ret = iLaunchThread.Open(threadId); // iLaunchThread is of type RThread        if(ret == KErrNone)            {            iLaunchThread.Logon(iStatus);            SetActive();            }


如何在手机启动时加载MIDlet程序
S60并不提供任何进制在设备启动时加载MIDlet,但我们可以用如上方法写一个迷你小程序,并将它放在手机启动列表中,以便手机一启动就加载到某个MIDlet程序。
注意这里在启动列表中出现的程序需要有一个合法签名认证。
要获得更多信息,可以参考SDK帮助中的Startup List Management API部分。

多媒体资料无法自动更新的问题

详细描述
在S60第三版设备上,当第三方程序向多媒体资料的图像和视频以及声音片段等目录添加媒体文件时,多媒体资料无法做到自动更新其视图。

解决方案
当我们使用document handler来拷贝或移动文件时,多媒体资料将会收到有新内容的通知。


我们可以在一个临时目录中生成新文件的拷贝,然后使用CDocumentHandler::SilentMoveL()将其移到正确位置,如下所示:

Code:
    TDataType nullType;        TInt ret = 0;                    TRAPD( moveErr, ret = iDocHandler->SilentMoveL(            _L("C:\\test_tmp.jpg"),            _L("test.jpg"),            PathInfo::PhoneMemoryRootPath(),            nullType,            KEntryAttNormal ) );

使用Document Handle API移动或拷贝文件时程序出现崩溃的问题

详细描述
当使用Document Handler API(CDocumentHandler)移动或拷贝文件时,程序可能会发生错误,报告KERN-EXEC 3错误

这是在缺省堆栈控件(8KB)上使用Document Handler时所出现的一个典型问题。

我们需要将堆栈空间调整到20KB,我们通过在mmp文件中,增加下列语句来完成:

Code:
epocstacksize 0x5000

如何使用和内建程序一样的背景

详细描述
可以在第三方程序中重用同内建程序(如记事本,Pinboard等)一样的背景图片。要做到这点,我们需要在view/control类中完成background control context(CAknsBasicBackgroundControlContext),要传递正确的skin ID以便生成。

举例来说,要设置一个editor(CEikEdwin)背景与记事本一样,我们需要用KAknsIIDQsnFrNotepad来生成control context:

Code:
#include <aknsconstants.h>  // for skin IDs        // iBackgroundContext is a member variable        iBackgroundContext = CAknsBasicBackgroundControlContext::NewL(                KAknsIIDQsnFrNotepad,                 Rect(),                 EFalse );                     // Set the background control context of an editor (CEikEdwin)        iEditor->SetSkinBackgroundControlContextL( iBackgroundContext );

同样,要使用Pinboard程序中的背景,就应该使用skin ID为KAknsIIDQsnBgAreaMainPinb。缺省的skin背景id为KAknsIIDQsnBgAreaMain,可以通过查看aknsconstants.h获得更多的信息。

置Carbide.c++ Express的命令行编译环境

概述
Carbide.c++ Express包括编译在模拟器上运行的程序所需要的所有工具,缺省状态下,该编译过程只能在Carbide IDE内完成。如果要在命令行下完成这些编译任务则需要额外做一些工作。

详细描述
按如下步骤操作,即可完成命令行下编译所需的系统环境:

找到env_update.exe程序,并运行它,可以在此找到:

Code:
<Carbide.c++_Express_Installation_folder>\Carbide.c++ Express v1.1\plugins\com.nokia.carbide.cpp.support_1.1.0.5\env_switch directory

当运行命令行窗口出现提示后,选择最后一个版本号。

关闭并重新打开命令行窗口。

现在只要输入如下语句即可编译模拟器版本程序,核对一下,输入如下命令:

Code:
cd <SDK_install_directory>\S60Ex\Helloworldbasic\group    bldmake bldfiles    abld build winscw ?    epoc


'''Huwell补充'''
以上说的是Carbide.c++ Express v1.1的,现在最新是Carbide.c++ Express v1.2,env_update.exe程序路径已经改变了,应该为:

Code:
\Program Files\Nokia\Carbide.c++ v1.2\x86Build\env_switch

并且运行后也不是如1.1的提示了,而是直接要求选择yes or no,这个自己可以运行查看。

Rich text editor中无法支持平滑字体(anti-aliased fonts)

概述
平滑缩放字体可以通过如下语句设置

Code:
TFontStyle::SetBitmapType(EAntiAliasedGlyphBitmap);

或者

Code:
TOpenFontSpec::SetBitmapType(EAntiAliasedGlyphBitmap);

平滑字体可以在graphics context上绘制,如在label中。但是当在rich text editor(CEikRichTextEditor)中应用时,改设置将被忽略。

解决方案
生成一个CCharFormatLayer对象,并使用SetGlobalCharFormat将其设置为global character format,如此编辑框则允许全局平滑。

Code:
    iMyCharFormatLayer = CCharFormatLayer::NewL();    // iMyCharFormatLayer is a class member        RichText()->SetGlobalCharFormat(iMyCharFormatLayer);

注意在析构函数中要释放该CCharFormatLayer对象。

静态库在Symbian平台上的使用

详细描述
Symbian编译工具提供了生成静态链接库的功能。当链接到静态库时,变量和运行部分的链接都已经在编译时完成了,静态库的代码已经和目标程序整合在一起了,因此静态链接和动态链接相比增加了可执行程序的大小。
当我们无需或没必要使用dll链接时,就可以考虑静态库的使用了。但是模块化和底层版本控制仍需完成。当在一个工程中开始使用静态库时,很容易将程序修改为使用静态接口DLL。
在MMP工程定义文件中,'''TARGETTYPE LIB'''被用来建立一个静态库,和其他类型程序相比(如APP或DLL等),我们只需要置顶UID1即可,其他就无需指定了。
因为一个静态库实质是一组对象的集合,无需链接到任何import library上,因此在静态库的MMP文件中,就无法涉及到LIBRARY和SYSTEMLIBRARY了,但该静态库的使用者应该保证相关所需库的引用。
全局和可写静态数据(WSD)虽然在静态库中可以使用,但通常不建议这么做,因为这会增加内存消耗,并且在模拟器上使用受限。此外,WSD可能在移植静态库时产生问题。

为何在模拟器中调用SysUtil::GetLangVersion()报告失败

下列方法:

Code:
static TInt SysUtil::GetLangVersion( TDes &aValue )

在S60第三版模拟器上执行时,总是返回-1错误(KErrNotFound)


解决方法
这是因为模拟器缺少了一个包括当前已安装语言包信息的文本文件。

该文件正确的路径及名称应为:
Code:

<SDK_Install_Path>\epoc32\release\winscw\?\z\resource\versions\lang.txt


这里提供一个附件,其中包含了缺少的文件,解压后将其拷贝在SDK安装文件夹中即可,如:
:\Symbian\9.1\S60_3rd_MR

如何在S60第三版设备上处理铃声静音

详细描述
当有来电时,我们可以通过S60第三版API扩展插件包中的Phone Client Extension API来进行静音处理。

第三方电话API(CTelephony)可以用来监测来电事件:
Extensions plug-in package for S60 3rd Edition SDK for Symbian OS, for C++, MR
[http://www.forum.nokia.com/info/sw.n...Pack1.zip.html

Extensions plug-in package for S60 3rd Edition SDK for Symbian OS, for C++, supporting FP1
http://www.forum.nokia.com/info/sw.n...g-In_Pack.html

解决方案:
下列代码演示了如何加载PhoneClientExt DLL,并且如何构造使用一个command handler(CPhCltCommandHandler)来静音铃声

Code:
Required capability: WriteDeviceData        /*** Header file ***/        #include <RPhCltServer.h>   // link against PhoneClient.lib        #include <PhCltExt.h>       // link against PhoneClientExt.lib        ...                RPhCltServer iPhoneClientServer;        RLibrary iLibrary;        CPhCltCommandHandler* iPhCommandHandler;             /*** Source file ***/        _LIT(KPhoneCltExDllName, "PhoneClientExt.dll");        User::LeaveIfError( iPhoneClientServer.Connect() );        User::LeaveIfError( iLibrary.Load(KPhoneCltExDllName) );        TInt res = iLibrary.Lookup(1)();        CPhCltExtFactory* phCltExtFactory = reinterpret_cast<CPhCltExtFactory*>( res );        iPhCommandHandler = phCltExtFactory->CPhCltCommandHandlerLD();        User::LeaveIfError( iPhCommandHandler->Open(iPhoneClientServer) );        // Mute an ongoing ringing tone. This should be done inside an active object        // (a class derived from CActive)        iPhCommandHandler->MuteRingingTone( iStatus );        SetActive();
如何对Open C组件进行依赖监测
详细描述
为确保Open C程序能够正常运行工作,我们有必要确保运行该程序所需要的Open C插件组件都已安装存在。这样如果当用户安装程序时,系统发现所需Open C库不存在,则会给出警告提示。


要生成这样的依赖监测,我们需要在PKG文件中做如下描述:

Code:
  (componentUID), version-range, {"Component name for lang 1","Component name for lang n",...}

对Open C插件组件的监测,则可描述如下:
Code:
  (0x20009a80), 1, 0, 0, {"Symbian OS PIPS"}      (0x20009aa2), 1, 0, 0, {"Symbian OS STDIOSERVER"}      (0x10281f34), 1, 0, 0, {"Open C LIBSSL"}      (0x10281f2c), 1, 0, 0, {"Open C GLIBRARY"}

上述示例中,描述了4个OpenC组件依赖监测:
Code:
  'Symbian OS STDIOSERVER' (installed from stdioserver.sis),       'Symbian OS PIPS' (pips_s60_wp.sis),       'Open C LIBSSL' (openc_ssl.sis),      'Open C GLIBRARY' (openc_glib.sis),

依赖监测也可以正对特定组件的版本进行:
Code:
(0x0123BABE), 1, 2, 0 ~ *, *, *, {"ComponentName"} ; Version greater than or equal to 1.2.0 is required    (0x0123BABE), 1, 2, 0 ~ 2, 0, 0, {"ComponentName"} ; Version from 1.2.0 to 2.00 required    (0x0123BABE), *, *, * ~ 2, 0, 0, {"ComponentName"} ; Any older version up to (and including) 2.0.0 is required
无法调用回音消除功能
详细描述
所有的S60设备都有一个内建的AEC(声学回音消除)硬件,以提高通话时的声音质量。
但是却没有可用的S60 API来调用这样的回音消除功能,因此第三方软件无法强制AEC的开启或关闭。

解决方案
尚无解决方案,无法通过编程来控制S60设备上的AEC。
无法通过内嵌SIS包向启动列表增加可执行文件
详细描述
在S60第三版SDK的"Startup List Management API Technical Specification"部分中描述了如何向启动列表增加可执行文件。

为了向启动列表中增加应用程序,SIS包必须满足下列需求:
1、安装包中包含的程序必须是可信任的,这就是说它应该包含有效签名;

2、安装程序包安装的可执行程序必须能被加到启动列表中;

3、在内嵌安装包的情况下,控制文件必须被主安装包所包含;

不管怎样,向启动列表中增加的可执行文件只能被主SIS所包含,因此即使主SIS中包含控制文件,也无法通过其内嵌SIS向启动列表添加可执行文件。

解决方案
要向启动列表添加的执行文件只能被主SIS直接包含,如果无法放在主SIS中(比如因为内嵌SIS和主SIS不通的capability需求),我们只能分别打包成独立SIS了。
当启动S60第三版FP1模拟器时出现NCNList KERN-EXEC 3错误
详细描述
当启动S60第三版FP1 SDK模拟器时,可能会显示“Application closed: ncnlist KERN-EXEC 3”错误警告。当警告消失时,模拟器就可以正常使用了,不过MTM开发者可能无法使用New Message Notification API来处理新消息来时对用户的通知。

如何重现
启动模拟器,并且将模拟器选项中的“Extended panic info file”勾上,你就会看到该错误。

解决方案
要解决这个问题,可将此附件解压后,放到SDK安装目录中,覆盖原有部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值