One of the first things I found out, is that the Psion serial port is cross wired.
That is, to connect to another device via the serial port you have to make a cross over cable.



I didn't draw this, and I can't remember where I got it from.

This explains why I couldn't get a modem to work with the Psion Message Suite. All the wires were crossed.

Below is OPL code for sending and receiving bytes or strings via the serial port of your Psion 5/Revo, probably works on most Psions. It has to be noted that at the end of each byte or string received, there are two more bytes that may have to be read and ignored. On the Revo, if you change the TTY:A to TTY:B, you can use the infrared port directly. I've not had much success with reading the port, but it transmitts OK.

A modified version of this code is used for communicating with my I/O board.

PROC main:
LOCAL pbuf%,buf$(255),len%,v$(255),ret%
LOPEN "TTY:A"
RSSET:(15,0,8,1,4,&0)
Print "Press, (s) to send. (r) to receive. (q) to quit"
v$=""
do
v$=get$
if v$ = "s"
print "send what ? ";
input v$
lprint v$
print "Done"
endif
if v$ = "r"
print "reading...";
len% =1
pbuf%=ADDR(buf$)
IOW(-1,1,#UADD(pbuf%,1),len%)
POKEB pbuf%,len%
print "received...";buf$
print "Done"
rem IOW(-1,1,#UADD(pbuf%,1),len%)
rem IOW(-1,1,#UADD(pbuf%,1),len%)
endif
until v$="q"
lclose
ENDP
PROC RSSET:(baud%,parity%,data%,stop%,hand%,term&)
LOCAL frame%,srchar%(6),dummy%,err%
frame%=data%-5
IF stop%=2 :frame%=frame% OR 16 :ENDIF
IF parity% :frame%=frame% OR 32 :ENDIF
srchar%(1)=baud% OR (baud%*256)
srchar%(2)=frame% OR (parity%*256)
srchar%(3)=(hand% AND 255) OR $1100
srchar%(4)=$13
POKEL ADDR(srchar%(5)),term&
err%=IOW(-1,7,srchar%(1),dummy%)
IF err% :RAISE err% :ENDIF
ENDP

More serial port info can be found here. But it's technical, not safe and not finished.