Programming for Palm OS/C/Serial
Appearance
Open the serial port:
UInt16 serPort; Err e = SrmOpen( serPortCradlePort, 9600, &serPort); ErrFatalDisplayIf( e != errNone, "could not open the serial port");
To send data:
Err e; char toSend = '\n'; SrmSend( serPort, &toSend, sizeof(toSend), &e);
To receive data is more involved:
// 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();
Quite a lot of API functions (if they are invoked within the received data handler) will cause fatal exceptions once the event manager wakes up, even functions that appear unrelated to events.
Where the application handles the special key code that indicates data has been received:
UInt8 *receiveBuffer; UInt32 bytesReceived; Err e = SrmReceiveWindowOpen( serPort, &receiveBuffer, &bytesReceived); if ( errNone == e) { SrmReceiveWindowClose( serPort, bytesReceived); }