本文描述了在Symbian OS / Series60 下,利用原始的(物理的)SIR框架的SIR(serial infrared)编程代码。
端口信息(RCommServ/GetPortInfo)返回IrComm 3 wire raw(Nokia 3650, Series60 1.2, SymbianOS 6.1中)。
Irscopesrc.zip 包含源代码,安装文件(irscope.sis),在\install 目录下和三张jpeg图片(\data directory目录下)以显示irscope的运行状态: Irscopepic1显示Actisys ACT-IR2000UL USB IR端口的输出/ Irscopepic2 和3显示Sony RMT-V197 IR 遥感器的输出(valinnat代表选项,takaisin代表返回,图片上Nokia 3650的返回的信息为完成)。
程序(irscope.sis)是使用Visual C++ ,Series60 SDK 1.2开发的,在Nokia 3650下 进行的测试(SymbianOS 6.1/Series60 1.2)。而且它也可运行在EPOC 模拟器上,但是并没有打开配置ircomm 端口也没有接收(RX) /传输 (TX).。
IrScope的总体结构
类:
irscopeaknctrl :设置通信参数操作GUI管理(查询和列表)进行通信参数设置并创建CErrorUI实例用于处理出错/退出异常情况。通信可设置参数为bps(传输速率),data bits(数据位),stop bits(停止位)和接收/传输超时。 irscopeengine:驱动类(观测类)创建接收和传输类病管理通信和sets/gets通信参数。 irscoperx:接收动态对象 irscopetx:传输动态对象 reporter:从IR端口输出打印虚拟类 ...加上标准的Symbian的类:container, view, app, appui 和document 。
从菜单中选择扫描开始进行扫描。按左键停止扫描。确保IR没在运行(不要当使用IrScope时选择红外线连接),例如,IR运行图标没有闪烁。
如果IR运行,IrScope 不能阅读端口,程序运行正常但是屏幕上没有任何现实。
通信参数可以通过comms 菜单设置,comms 参数会显示在IrScope 屏幕的上部分,例如,9600,8,1 代表 9600 bps, 8 data bits和 1 stop bit。
打开配置IR端口
神奇的技巧就是加载ECUART 通信模块,打开串行端口(COMM::0),而不是 IRCOMM 和设置ESIREnable(portConfig().iSIREnable)。
// Device driver names _LIT(KLddName, "ECOMM");
#if defined (__WINS__) _LIT(KPddName, "ECDRV"); #else _LIT(KPddName, "EUART1"); #endif
// Communication modules _LIT(KRS232, "ECUART"); _LIT(KIrDA, "IRCOMM"); _LIT(KCommPort, "COMM::0");
// Load device drivers TInt err = User::LoadPhysicalDevice(KPddName); if ((err != KErrNone) && (err != KErrAlreadyExists)) User::Leave(err); err = User::LoadLogicalDevice(KLddName); if ((err != KErrNone) && (err != KErrAlreadyExists)) User::Leave(err);
StartC32(); User::LeaveIfError(iCommServ.Connect()); err = iCommServ.LoadCommModule(KRS232);
TInt err = iComm.Open(iCommServ, KCommPort, ECommExclusive);
TCommCaps commCaps; iComm.Caps(commCaps);
//Nokia 3650 (maybe other Nokia Series60 models too!?) //Raw IR (PHY) frames work although commCaps returns KErrNotSupported /*if (((commCaps().iRate & iBps) == 0) || ((commCaps().iDataBits & iDataBits) == 0) || ((commCaps().iStopBits & iStopBits) == 0) || ((commCaps().iSIR & ESIREnable) == 0)) User::Leave(KErrNotSupported);*/ TCommConfig portConfig; iComm.Config(portConfig); portConfig().iHandshake = 0; portConfig().iDataBits = iDataBits; portConfig().iStopBits = iStopBits; portConfig().iParity = EParityNone; portConfig().iSIREnable = ESIREnable; portConfig().iSIRSettings = KConfigSIRPulseWidthMaximum; portConfig().iRate = iBps; User::LeaveIfError(iComm.SetConfig(portConfig));
接收和传输动态对象
需要两个动态对象,一个接收,另一个传输。驱动类irscopeengine创建接收/传输动态对象irscoperx和 irscopetx。动态对象每次仅可以操作一次请求,这就是需要两个动态对象的原因。接收动态对象信号,驱动会通知传送来的数据并设置新的读请求。 void CIrScopeRx::RunL() { iEngine.RxDataAvail(iRxData); ReadComm(); } 传输类可以发送从IR端口收到的ascii 数据最后的数据块。 void CIrScopeTx::WriteComm(const TDesC& aTxData) { if (!IsActive()) { iTxData.Copy(aTxData); iTxComm.Write(iTxStatus, iTxTimeOut, iTxData); SetActive(); } }
远景开发想法
这一小功能可以很容易被进一步开发。例如: slider管理来设置SIR脉冲宽度(KConfigSIRPulseWidthMinimum - KConfigSIRPulseWidthMaximum)/ 利用CPlainText 类的导出方法来写文本流(例如,顺序文件)。CEikEdwin Text方法获得CPlainText指针到Edwin文件内容。 增加剖析器,用十六进制或二进制来显示数据,而不是普通的ascii 文本。
此文为开发视界翻译转载者请注明出处否则追究法律责任 |