Palm OS/C/串行编程
外观
< Palm OS 编程 | C
打开串行端口
UInt16 serPort; Err e = SrmOpen( serPortCradlePort, 9600, &serPort); ErrFatalDisplayIf( e != errNone, "could not open the serial port");
要发送数据
Err e; char toSend = '\n'; SrmSend( serPort, &toSend, sizeof(toSend), &e);
要接收数据更加复杂
// This fragment is used in two places
//
void prime_receive_handler()
{
UInt16 minBytes = 1;
SrmPrimeWakeupHandler( serPort, minBytes);
}
#define MAGIC_KEYCODE 0xa43d
// This method is invoked by Palm OS when data is received
//
void data_received( UInt32 appData)
{
// This method is invoked as an interrupt handler. Send a "special" key code
// to the application to indicate that it should read the receive buffer
WChar ascii = 0;
UInt16 keyCode = MAGIC_KEYCODE;
UInt16 modifiers = 0;
EvtEnqueueKey( ascii, keyCode, modifiers);
EvtWakeup();
// EvtWakeupWithoutNilEvent is unavailable on Palm OS 3.5
// Indicate that the handler is ready for more
prime_receive_handler();
}
// Indicate the code that should run when data is received
UInt32 appData = NULL; // or whatever you wish passed
SrmSetWakeupHandler( serPort, data_received, appData);
prime_receive_handler();
一旦事件管理器唤醒,许多 API 函数(如果在接收到的数据处理程序中调用)会导致致命异常,即使是那些与事件无关的函数也会如此。
应用程序处理表明已经收到数据的特殊键代码的位置
UInt8 *receiveBuffer;
UInt32 bytesReceived;
Err e = SrmReceiveWindowOpen( serPort, &receiveBuffer, &bytesReceived);
if ( errNone == e)
{
SrmReceiveWindowClose( serPort, bytesReceived);
}