This code is from project: Android tablet controlling stepper motor
main.h
#ifndef _H_MAIN_H #define _H_MAIN_H #endif
main.c
#include "main.h" #include "server.h" #include "serial.h" #include <stdio.h> /****************************************************************************/ /* Main */ /****************************************************************************/ int main(int argc, char **argv) { printf("Started\n"); initSerial(SERIAL_DEVICE); serialCmd(35, 10); // start server on port 8000 runServer(8000); closeSerial(); return 0; }
serial.h
#ifndef _H_SERIAL_H #define _H_SERIAL_H #define SERIAL_DEVICE "/dev/ttyATH0" #define SERIAL_SPEED B9600 #define RECV_RST 1 #define RECV_ERR 2 #define RECV_OK 3 #define RECV_TIMEOUT 4 int initSerial(char *); int writeCmd(char *); int readAnswer(int); int closeSerial(void); int serialCmd(unsigned char, unsigned char); #endif
serial.c
#include <stdio.h> #include <string.h> #include <termios.h> #include <sys/stat.h> #include <fcntl.h> #include <time.h> #include "serial.h" static int devHandle = -2; /****************************************************************************/ /* Init serial port */ /****************************************************************************/ int initSerial(char *device) { struct termios opt; devHandle = open(device, O_RDWR| O_NOCTTY | O_NDELAY | O_SYNC); if (devHandle == -1) { perror("Unable to open device"); return 1; } fcntl(devHandle, F_SETFL, FNDELAY); if (tcgetattr(devHandle, &opt) == -1) { perror("Unable to obtain device info"); return 1; } if (cfsetispeed(&opt, SERIAL_SPEED) !=0 ) { perror("Unable to set RX speed"); return 1; } if (cfsetospeed(&opt, SERIAL_SPEED) != 0) { perror("Unable to set TX speed"); return 1; } opt.c_cflag |= (CLOCAL | CREAD); opt.c_cflag &= ~PARENB; opt.c_cflag &= ~CSTOPB; opt.c_cflag &= ~CSIZE; opt.c_cflag |= CS8; opt.c_lflag &= ~(ICANON | ECHO); opt.c_oflag &= ~OPOST; if (tcsetattr(devHandle, TCSANOW, &opt) == -1) { perror("Unable to setup port"); return 1; } // cleaning rs232 buffer printf("Cleaning buffer, timeout is ok.\n"); readAnswer(2); return 0; } /****************************************************************************/ /* Write string to port */ /****************************************************************************/ int writeCmd(char *s) { if (write(devHandle, s, strlen(s)) == -1) { perror("Write error"); return 1; } return 0; } /****************************************************************************/ /* Read answers from RS232 port */ /****************************************************************************/ int readAnswer(int readSecWait) { char recvBuff = ' '; int readBytes= 0; time_t startTime; time_t currentTime; time(&startTime); time(¤tTime); while(1) { recvBuff = ' '; readBytes = read(devHandle, &recvBuff, 1); if (readBytes > 0) { switch(recvBuff) { case 'R': { return RECV_RST; } break; case 'O': { return RECV_OK; } break; case 'E': { printf("Communication error\n"); return RECV_ERR; } break; default: { printf("Unknown answer\n"); return RECV_ERR; } }; } if (difftime(currentTime, startTime) >= readSecWait) break; time(¤tTime); } printf("Read timeout\n"); return RECV_TIMEOUT; } /****************************************************************************/ /* Sending command to device connected to RS232 */ /****************************************************************************/ int serialCmd(unsigned char x, unsigned char readWait) { char cmdBuff[4]; // send 'R' - start transmission writeCmd("R"); if(readAnswer(readWait) == RECV_RST) { // prepare and send position information sprintf(cmdBuff, "%02dV", x); writeCmd(cmdBuff); if(readAnswer(readWait) == RECV_OK) return 0; else printf("Without position confirmation !\n"); } else printf("Without restet confirmation !\n"); return 1; } /****************************************************************************/ /* Cleanup */ /****************************************************************************/ int closeSerial() { if(devHandle != -2 && close(devHandle) != 0) { perror("Closing device handle"); return 1; } return 0; }
server.h
#ifndef _H_SERVER_H #define _H_SERVER_H #define MAX_READ_SIZE 80 unsigned char runServer(short); unsigned char getData(int *); #endif
server.c
#include "server.h" #include "serial.h" #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <error.h> #include <errno.h> #include <stdio.h> unsigned char getData(int *sockFd) { ssize_t readBytes; char buff[MAX_READ_SIZE]; float x, y, z; static unsigned char xPos=45; memset(&buff, 0, MAX_READ_SIZE); // get data from socket if ( (readBytes = read(*sockFd, buff, MAX_READ_SIZE)) == 0) { printf("Connection closed by client\n"); return 0; } x = 0; y = 0; z = 0; //printf("Debug: |%s|\n", buff); // if sscanf coud match format, then process data if(sscanf(buff, "%f %f %f\r\n", &x, &y, &z) == 3) { printf("Received % 2.4f, % 2.4f, % 2.4f\n", x, y, z); // ugly bugfix for to fast transmission, sscanf was matching // format, but nubers was to big, setting position is blocking // someday I will put in in a thread, but this is only 'hello accel' // program so why bother ... if(x < 6 ) { // rotated to the right if(x > 2) { xPos++; } // rotated to the left if(x < -2) { xPos--; } // if we are in the range, set position if(xPos >=0 && xPos <91) serialCmd(xPos, 2); } } return 1; } unsigned char runServer(short port) { int listenFd, sockFd; socklen_t cliLen; struct sockaddr_in cliAddr, servAddr; if ( (listenFd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("Socket: "); return 1; } memset(&servAddr, 0, sizeof(struct sockaddr_in)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(port); if( bind(listenFd, (struct sockaddr *) &servAddr, sizeof(struct sockaddr_in)) == -1) { perror("Bind: "); return 1; } if( listen(listenFd, 1) == -1) { perror("Listen: "); return 1; } while( 1 ) { cliLen = sizeof(struct sockaddr_in); if ( (sockFd = accept(listenFd, (struct sockaddr *) &cliAddr, &cliLen)) < 0) { if (errno == EINTR) continue; perror("Accept: "); return 1; } printf("Connection from %s\n", inet_ntoa(cliAddr.sin_addr)); while(getData(&sockFd)); close(sockFd); } return 0; }
Makefile
PROJECT_NAME=netdriver OBJECTS=main.o server.o serial.o INCLUDES= #LIBS=-lpthread LIBS= MACROS= all: clean cls $(PROJECT_NAME) $(PROJECT_NAME): $(OBJECTS) $(CC) -o $(PROJECT_NAME) $(OBJECTS) $(LDFLAGS) $(LIBS) $(MARCOS) $(INCLUDES) main.o: main.c main.h $(CC) $(CFLAGS) $(INCLUDES) $(MACROS) -c main.c server.o: server.c server.h $(CC) $(CFLAGS) $(INCLUDES) $(MACROS) -c server.c serial.o: serial.c serial.h $(CC) $(CFLAGS) $(INCLUDES) $(MACROS) -c serial.c clean: rm -f $(PROJECT_NAME) $(OBJECTS) cls: clear
Thanks for postinng this
ReplyDelete