written by the John Crispin
The following example explains how a CGI written in C can be used to relay HTTP parameters to a serial port.
When calling the CGI, you are presented with 2 forms, that can be used to send ascii or hex data to the serial port. Once data was sent, the code will sleep for 1 second and then see if an answer was received.
This example can be tested together with the example given in Using serial ports in C.
The code should be self explainatory and it should be easy to modify it for your needs. Simply copy the compiled executable class='acmetable' to the cgi folder and browse to it.
/*
TTY CGI demo app
Copyright (C) 2006 John Crispin
This is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This example is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
To have a copy of the GNU General Public License write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdarg.h>
#include <signal.h>
#include "lib_tty.h"
// the serial device that will be used by the CGI
#define TTYS "/dev/ttyS3"
// this function is used to parse the QUERY_STRING environment variable
int read_parameter(char *name, char *value, int maxlen){
char *pos1, *pos2;
char *query_string = getenv("QUERY_STRING");
int success = 0;
if(query_string){
pos1 = strstr(query_string, name);
if(pos1){
pos1 += strlen(name) + 1;
pos2 = strstr(pos1, "&");
if(pos2){
*pos2 = '\0';
};
if(strlen(pos1) >= maxlen){
pos1[maxlen] = '\0';
};
strcpy(value, pos1);
success = 1;
};
};
return success;
};
// the applications main function
int main(int argc, char *argv[]) {
// the descriptor for the serial port
int tty_fd_out;
// buffer used for serial input/output
char buffer[1024];
// print out the default cgi header
printf("Content-type: text/html\n\n");
// print out the html header
printf("<html>\n<head>\n<title>Serial CGI example</title></head><body>");
// try to open the serial port
tty_fd_out = tty_open(TTYS);
if (tty_fd_out < 0) {
printf ("tty open error %s\n</body>", TTYS);
exit(EXIT_SUCCESS);
}
// print out the page header
printf("<h1>Acmesystems - TTY CGI</h1>");
// print out the html forms
printf("<form method=get>\n");
printf("ASCII data <input type=text name=write_ascii>");
printf("<input type=submit value=\"Send on %s\">", TTYS);
printf("</form>\n");
printf("<br><br>");
printf("<form method=get>\n");
printf("HEX data <input type=text name=write_hex>");
printf("<input type=submit value=\"Send on %s\">", TTYS);
printf("</form>\n");
// if we write data, we wait for 1 second to see if we get an answer
int wait_answer = 0;
// are we supposed to send a ascci string to the serial port ?
char env_write_ascii[128];
if(read_parameter("write_ascii", env_write_ascii, 128)){
if(strlen(env_write_ascii)){
printf("<hr>writing ascii string \"%s\" on %s<br>", env_write_ascii, TTYS);
tty_printf(tty_fd_out, env_write_ascii);
wait_answer = 1;
};
};
// are we supposed to send a 32bit hex value to the serial port ?
char env_write_hex[8];
if(read_parameter("write_hex", env_write_hex, 8)){
if(strlen(env_write_hex)){
unsigned int numeric;
printf("<hr>writing 32 bit hex data \"%s\" (%u) on %s<br>", env_write_hex, numeric, TTYS);
sscanf(env_write_hex, "%X", &numeric);
buffer[0] = (numeric >> 24) & 0xff;
buffer[1] = (numeric >> 16) & 0xff;
buffer[2] = (numeric >> 8) & 0xff;
buffer[3] = (numeric >> 0) & 0xff;
tty_tx(tty_fd_out, buffer, 4);
wait_answer = 1;
};
};
// if we have send out data, we wait for 1 second and then try to read in an answer
if(wait_answer){
memset(buffer, 0, 128);
sleep(1);
int count = tty_rx(tty_fd_out, buffer, 128);
if(count != -1){
printf("<hr>read %d bytes -> \"%s\" from %s<br>", count, buffer, TTYS);
} else {
printf("<hr>there was no pending data on %s", TTYS);
};
};
// print out the html footer
printf("</body>");
return EXIT_SUCCESS;
};