Bueno, he estado modificando el programa del psp_remote, para quitarle alguna funcionalidad que creo que no necesitamos por ahora (la interfaz), y hacer que mande comandos, y lo que reciba imprimirlos.
Lo he compilado y ejecutado, recibiendo un "Error writing Frame", ya que en el portatil no tengo ni siquiera Puerto Com
.
No lo he probado en windows, sólo en Linux, pero creo que en windows no va a funcionar, ya que DEFAULT_DEV = "/dev/ttyS0" me dá a mi que sólo va a funcionar en Linux
¿Qué hace el programa? Configura el serial, comprueba que está encendido y que tiene comunicación con la PSP (que recibe voltaje, creo), y una vez hecho ésto, envía una trama de Request to Transmit. Luego se queda esperando respuesta (con un bucle infinito), por tanto habrá que salir con CTRL-C.
Ahora necesito que alguien lo pruebe, y me diga si da fallos, si recibe un 0xF8 (imprimirá en consola F8), o si el programa devuelve "Error writing frame".
Como compilarlo && ejecutarlo: Copia todo el quote en un archivo, y llámalo "ComoQuieras.c". Vete a una consola, entra en la carpeta donde has guardado el archivo, y pon en consola "gcc ComoQuieras.c && ./a.out".
Y por último, aquí os dejo el fuente:
#include
#include
#include
#include
#include
#include
#include
#include
#include // serial line status
#include // parameter processing
// Current processing state
#define STATE_OFFLINE 0x00 // PSP is not powering up the serial port
#define STATE_ONLINE 0x01 // PPS is powering serial port (2.5V on pin 5)
#define STATE_RESET 0x02 // We just went back on
#define STATE_RTS 0x04 // Request To Send has been received FROM the PSP
#define STATE_CTS 0x08 // Clear To Send has been received FROM the PSP
#define STATE_WAIT_ACK 0x10 // Pending ACK FROM the PSP (after message has been sent)
#define BAUDRATE B4800 // baud rate the device spits out at
#define MAX_BYTES 10 // Maximum number of bytes per frame
#define NAME_SIZE 64 // Maximum Name Size
#define DEFAULT_DEV "/dev/ttyS0" // Default Device Name
// Serial port file descriptor
int fd_serial = 0;
// Current processing state
int state = STATE_OFFLINE;
// The termios functions describe a general terminal interface that is
// provided to control asynchronous communications ports.
struct termios tty;
// serial interrupt
struct sigaction saio;
// serial interrupt handler prototype
void serial_handler();
/*
*
* check_status(): Monitor serial port status
*
*/
int check_status() {
int serial_status;
// Clear RESET flag if set
if (state & STATE_RESET)
state &= ~STATE_RESET;
// Check for any change of RS232_CTS, to indicate whether the device is powered
ioctl(fd_serial, TIOCMGET, &serial_status);
if (serial_status & TIOCM_CTS) { // RS323_CTS is on
if (!(state & STATE_ONLINE)) { // We just went back on
state = STATE_ONLINE | STATE_RESET;
printf("Status -> Online\n");
}
} else { // RS232_CTS is off => PSP has cut serial line power
if (state & STATE_ONLINE) { // We just went offline
tcflush(fd_serial, TCIFLUSH); // flush serial port
printf("Status -> OFFline\n");
}
state = STATE_OFFLINE;
}
return 0;
}
void configSerial() {
bzero(&tty, sizeof(tty)); // Initialize the port settings structure to all zeros
tty.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; // 8N1
tty.c_iflag = IGNPAR; // A byte with framing or parity errors (other than break) is ignored
tty.c_oflag = 0;
tty.c_lflag = 0;
tty.c_cc[VMIN] = 0; // 0 means use-vtime
tty.c_cc[VTIME] = 1; // time to wait until exiting read (tenths of a second)
tcflush(fd_serial, TCIFLUSH); // flush old data and apply new settings
tcsetattr(fd_serial, TCSANOW, &tty);
fcntl(fd_serial, F_SETOWN, getpid()); // enable our PID to receive serial interrupts
fcntl(fd_serial, F_SETFL, FASYNC);
saio.sa_handler = serial_handler; // set the serial interrupt handler
sigemptyset(&saio.sa_mask); // clear existing settings
saio.sa_flags = 0; // make sure sa_flags is cleared
saio.sa_restorer = NULL; // no restorer
sigaction(SIGIO, &saio, NULL); // apply new settings
}
int writeToSerial() {
int length = 0;
unsigned short write_buffer[MAX_BYTES+3];
write_buffer[length++]=0xF0; // Request to send -> "I want to speak, are you ready?"
if(write(fd_serial, write_buffer, length) != length)
printf("Error writing Frame\n");
return 0;
}
int readFromSerial() {
return 0;
}
int main(int argc, char *argv[]) {
char devname[NAME_SIZE] = DEFAULT_DEV;
int quit = 0;
fd_serial = open(devname, O_RDWR | O_NOCTTY | O_NONBLOCK);
configSerial();
check_status();
writeToSerial();
while ( quit != 1) { // CUTREEE -> Así no sale, y esperamos hasta que reciba algo
}
}
/*
*
* serial_handler() : called whenever there is inboud data to process
*
*/
void serial_handler () {
unsigned short temp_buffer[256];
int length,i;
// Read the serial data into a temporary buffer
length = read(fd_serial, temp_buffer, sizeof(temp_buffer));
// Print length of the data received
printf("Length -> %i",length);
// Print the data received
for (i=0; i printf("DATA[%i] -> %X", i, temp_buffer[i]);
}
}
PD: Me voy a hacer windsurf. Cuando vuelva me decís si funciona, y empezamos a enviar todos los comandos posibles