#include <termios.h> /* tcgetattr, tcsetattr */
#include <stdio.h> /* perror, printf, puts, fprintf, fputs */
#include <unistd.h> /* read, write, close */
#include <fcntl.h> /* open */
#include <sys/signal.h>
#include <sys/types.h>
#include <string.h> /* bzero, memcpy */
#include <limits.h> /* CHAR_MAX */
#include "vardef.h" /* INT32, INT16, INT8, UINT32, UINT16, UINT8 */
#include "serial.h"
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h> /* close */
#include <arpa/inet.h>
#include <stdlib.h>
#define RECVBUFSIZE 1024
int biaozhiwei=0;
typedef struct people
{
int biaozhi;
char name[10];
char status[4];
char mode[10];
} people;
/*发送指令函数---89行*/
int send_command ()
{
int sockfd;
char buffer[RECVBUFSIZE];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber, nbytes;
portnumber = 123456;
/*if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
} */
/*客户程序开始建立 sockfd描述符*/
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf (stderr, "Socket Error:%s\a\n", strerror (errno));
exit (1);
}
/*客户程序填充服务端的资料*/
bzero (&server_addr, sizeof (server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons (portnumber);
//server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
/*客户程序发起连接请求*/
if (connect
(sockfd, (struct sockaddr *) (&server_addr),
sizeof (struct sockaddr)) == -1)
{
fprintf (stderr, "Connect Error:%s\a\n", strerror (errno));
exit (1);
}
people test;
/*连接成功*/
test.biaozhi=biaozhiwei;
memset (test.name, 0, 10);
memcpy (test.name, "Fan", sizeof (test.name));
memset (test.status, 0, 4);
memcpy (test.status, "ON", sizeof (test.status));
memset (test.mode, 0, 10);
memcpy (test.mode, "Fast", sizeof (test.mode));
if ((nbytes = send (sockfd, (void *) &test, sizeof (test), 0) == -1))
{
fprintf (stderr, "Read Error:%s\n", strerror (errno));
exit (1);
}
//buffer[nbytes]='\0';
/*printf("I have received:\nname:%s\nstatus:%s\nmode:%s\n",test.name,test.status,test.mode); */
/*结束通讯*/
close (sockfd);
//exit(0);
}
/*
* Decription for TIMEOUT_SEC(buflen,baud);
* baud bits per second, buflen bytes to send.
* buflen*20 (20 means sending an octect-bit data by use of the maxim bits 20)
* eg. 9600bps baudrate, buflen=1024B, then TIMEOUT_SEC = 1024*20/9600+1 = 3
* don't change the two lines below unless you do know what you are doing.
*/
#define TIMEOUT_SEC(buflen,baud) (buflen*20/baud+2)
#define TIMEOUT_USEC 0
#define TRUE 1
#define FALSE -1
#define BUFFER_LEN 1024 /* sendfile() */
char numbuf[200];
int ringflag = 0, callnumf = 0, getnumf = 0;
static INT32 fd; //File descriptor for the port
static struct termios termios_old, termios_new;
static fd_set fs_read, fs_write;
static struct timeval tv_timeout;
static struct sigaction sigaction_io; /* definition of signal action */
static int SetPortSig ();
static void signal_handler_IO (int status);
static void SetBaudrate (INT32);
static INT32 GetBaudrate ();
static void SetDataBit (INT32 databit);
static INT32 BAUDRATE (INT32 baudrate);
static INT32 _BAUDRATE (INT32 baudrate);
static INT32 SetPortAttr (INT32 baudrate, INT32 databit,
const char *stopbit, char parity);
static void SetStopBit (const char *stopbit);
static void SetParityCheck (char parity);
/* Open serial port ComPort at baudrate baud rate. */
INT32 OpenComPort (INT32 ComPort, INT32 baudrate, INT32 databit,
const char *stopbit, char parity)
{
char *pComPort;
INT32 retval;
switch (ComPort) {
case 0:
pComPort = "/dev/ttyS0";
break;
case 1:
pComPort = "/dev/ttyS1";
break;
case 2:
pComPort = "/dev/ttyS2";
break;
case 3:
pComPort = "/dev/ttyS3";
break;
case 4:
pComPort = "/dev/ttyS4";
break;
case 5:
pComPort = "/dev/ttyS5";
break;
case 6:
pComPort = "/dev/ttyS6";
break;
case 7:
pComPort = "/dev/ttyS7";
break;
default:
pComPort = "/dev/ttyS0";
break;
}
fd = open (pComPort, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (-1 == fd) {
fprintf (stderr, "cannot open port %s\n", pComPort);
return (-1);
}
tcgetattr (fd, &termios_old); /* save old termios value */
/* 0 on success, -1 on failure */
retval = SetPortAttr (baudrate, databit, stopbit, parity);
if (-1 == retval) {
fprintf (stderr, "\nport %s cannot set baudrate at %d\n", pComPort,
baudrate);
}
return (retval);
}
/* close serial port by use of file descriptor fd */
void CloseComPort ()
{
/* flush output data before close and restore old attribute */
tcsetattr (fd, TCSADRAIN, &termios_old);
close (fd);
}
INT32 ReadComPort (void *data, INT32 datalength)
{
INT32 retval = 0;
FD_ZERO (&fs_read);
FD_SET (fd, &fs_read);
tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ());
tv_timeout.tv_usec = TIMEOUT_USEC;
retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout); //Linux下用select查询串口数据
if (retval) {
return (read (fd, data, datalength));
}
else
return (-1);
}
/*
* Write datalength bytes in buffer given by UINT8 *data,
* return value: bytes written
* Nonblock mode
*/
INT32 WriteComPort (UINT8 * data, INT32 datalength)
{
INT32 retval, len = 0, total_len = 0;
FD_ZERO (&fs_write);
FD_SET (fd, &fs_write);
tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ());
tv_timeout.tv_usec = TIMEOUT_USEC;
for (total_len = 0, len = 0; total_len < datalength;) {
retval = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout);
if (retval) {
len = write (fd, &data[total_len], datalength - total_len);
if (len > 0) {
total_len += len;
}
}
else {
tcflush (fd, TCOFLUSH); /* flush all output data */
break;
}
}
return (total_len);
}
/* get serial port baudrate */
static INT32 GetBaudrate ()
{
return (_BAUDRATE (cfgetospeed (&termios_new)));
}
/* set serial port baudrate by use of file descriptor fd */
static void SetBaudrate (INT32 baudrate)
{
termios_new.c_cflag = BAUDRATE (baudrate); /* set baudrate */
}
static void SetDataBit (INT32 databit)
{
termios_new.c_cflag &= ~CSIZE;
switch (databit) {
case 8:
termios_new.c_cflag |= CS8;
break;
case 7:
termios_new.c_cflag |= CS7;
break;
case 6:
termios_new.c_cflag |= CS6;
break;
case 5:
termios_new.c_cflag |= CS5;
break;
default:
termios_new.c_cflag |= CS8;
break;
}
}
static void SetStopBit (const char *stopbit)
{
if (0 == strcmp (stopbit, "1")) {
termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
}
else if