From the testing that @Andrew_Strauss and I did, it appears that fopen with mode "rb" puts the internal RS-485 transceiver in reading mode, while the "wb" mode puts it in writing mode. As RS-485 is only half-duplex, there’s no way to (usefully) enable both reading and writing at the same time.
You shouldn’t have to use any special kernel API functions (in either VCS or PROS) to read/write, it should just be via device files (/dev/port## on VCS, /dev/## on PROS). Unfortunately, there appears to some internal issue in the PROS smart device driver that prevents it from working as-is; we’ve been talking to the devs but as of yet haven’t been able to find a solution. I’m going to look into it more when I have time; we’re planning on getting it working in PROS for VEX U.
In the meantime, here is the VCS code that I got working, based on this code from jpearman:
#include <stdio.h>
#include "robot-config.h"
using namespace vex;
int main() {
// IO using stdio
//**********************
FILE *fp1, *fp2;
fp1 = fopen( "/dev/port20", "wb" );
fp2 = fopen( "/dev/port18", "rb" );
while(1) {
if( fp1 != NULL ) {
fprintf(fp1, "Hello\r\n");
fflush(fp1);
}
if( fp2 != NULL ) {
char buf[128];
int nRead = fread( buf, 1, 128, fp2 );
if( nRead > 0 ) {
for(int i=0;i<nRead;i++) {
printf("%02X ", buf[i]);
}
printf("\n");
}
}
this_thread::sleep_for(10);
}
}