首 页 | 新 闻 | Symbian | Windows Mobile| J2ME | 下载中心 | 游戏策划 | 购书指南 | 移动开发视频教程
您现在的位置: 开发视界 >> 专家专栏 >> 新鲜的Lychee >> 文章正文
编程IrComm3 原始通信
作者:新鲜的Ly…    文章来源:本站原创    更新时间:2006-6-15 15:06:46

本文描述了在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 文本。

此文为开发视界翻译转载者请注明出处否则追究法律责任

相关文章:
在P800/P910中找回已拨打号码
使用开发者平台为S90系列手机开发移动应用程序
利用 RSocket::Read() 函数读取给定数据的字节数
gnuBox 和 Nokia 3230
普通产品的UID
关于摄像头的一个API帮助文档RCameraServ类
虚拟机模型
Symbian sdk帮助-类TDes8