串口通信

串口通讯是一个底层的,点对点的技术,用来在两台手机间传输数据,特别是近距离范围。S60支持通过红外和蓝牙进行串口通讯。对S60来说是用串口 通讯服务来完成的(也被称为Comms Server或C32)。这个使用Symbian OS客户端/服务器模式来提供串口硬件的访问,并且它更具通用信(也就是说,同样的API可以为红外和蓝牙串口通信服务,注意不同的硬件可以通过额外的插 件支持),而且也须有共享性(换句话说,几个客户端线程可以更加安全的同时使用同一个串口)

 

Contents

[hide ]

 

S60上所有的串口通信都使用如下步骤完成:

  • 加载串口设备驱动
  • 开启Comms Server
  • 连接Comms Server
  • 加载一个comms模块(通常也叫CSY)这是Comms Server插件,它决定你使用串口的类型(如红外还是蓝牙)
  • 打开串口
  • 配置串口
  • 向串口写输入/读取数据
  • 最后关闭串口

一个红外串口通信的示例

所需重要的类:

RCommServ // serial comms

RComm // comm port

TBuf8<64> Data // data to transmit

第一部分

  • 加载物理和逻辑设备的驱动
  • 连接到Serial comms server
  • 加载CSY模块

 

err = User::LoadPhysicalDevice(KPddName);
if (err != KErrNone && err != KErrAlreadyExists)
{
User::Leave(err);
}
// Load the logical device driver.
err = User::LoadLogicalDevice(KLddName);
if (err != KErrNone && err != KErrAlreadyExists)
{
User::Leave(err);
}
// Start the comms server process
err = StartC32();
if (err != KErrNone && err != KErrAlreadyExists)
{
User::Leave(err);
}
// Connect to the Serial comms server.
User::LeaveIfError(iCommServer.Connect());
// Load the CSY module.
User::LeaveIfError(iCommServer.LoadCommModule(KIrComm));
}

第二部分

  • 打开串口
  • 检查端口兼容性
  • 配置端口
  • 设置缓冲尺寸


//Open the serial port

User::LeaveIfError(iCommPort.Open(iCommServer, KPortName, ECommShared));

// Check port capabilities
TCommCaps portCapabilities;
iCommPort.Caps(portCapabilities);
if (((portCapabilities().iRate & KCapsBps19200) == 0) ||
((portCapabilities().iDataBits & KCapsData8) == 0) ||
((portCapabilities().iStopBits & KCapsStop1) == 0) ||
((portCapabilities().iParity & KCapsParityNone) == 0))
User::Leave (KErrNotSupported);
// Configure port
TCommConfig portSettings;
iCommPort.Config(portSettings); // Get current configuration
// Set port characteristics
portSettings().iRate = EBps19200;
portSettings().iParity = EParityNone;
portSettings().iDataBits = EData8;
portSettings().iStopBits = EStop1;
portSettings().iFifo = EFifoEnable;
portSettings().iHandshake = KConfigObeyXoff|KConfigSendXoff;
portSettings().iTerminator[0] = 10; // line feed character
portSettings().iTerminatorCount = 1;
User::LeaveIfError(iCommPort.SetConfig(portSettings));
// Turn on DTR and RTS
iCommPort.SetSignals(KSignalDTR, 0);
iCommPort.SetSignals(KSignalRTS, 0);
// Set buffer size
const TInt KBufferLength = 4096;
iCommPort.SetReceiveBufferLength(KBufferLength);
}

 


第三部分

  • 写数据到串口

 


 

const TTimeIntervalMicroSeconds32 KTimeOut(4000000);
iCommPort.Write(iStatus, KTimeOut, Data);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值