串口通讯是一个底层的,点对点的技术,用来在两台手机间传输数据,特别是近距离范围。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);