summaryrefslogtreecommitdiff
path: root/Modelica-Arduino-MDD_Arduino_Revised/Resources/src/serialComm.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modelica-Arduino-MDD_Arduino_Revised/Resources/src/serialComm.c')
-rwxr-xr-xModelica-Arduino-MDD_Arduino_Revised/Resources/src/serialComm.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/Modelica-Arduino-MDD_Arduino_Revised/Resources/src/serialComm.c b/Modelica-Arduino-MDD_Arduino_Revised/Resources/src/serialComm.c
new file mode 100755
index 0000000..6fd915a
--- /dev/null
+++ b/Modelica-Arduino-MDD_Arduino_Revised/Resources/src/serialComm.c
@@ -0,0 +1,156 @@
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h> /* memset */
+#include <stdio.h>
+#include <stropts.h>
+#include "../Include/serial.h"
+#define MAXPORTS 5
+static int fd;
+
+int set_interface_attribs (int fd, int speed, int parity)
+{
+ struct termios tty;
+ memset (&tty, 0, sizeof(tty));
+ if (tcgetattr (fd, &tty) != 0)
+ {
+ return -1;
+ }
+ int posix_baudrate=0;
+
+ switch(speed) {
+ case 115200: posix_baudrate = B115200; break;
+ //default: return -1;
+ }
+ cfsetospeed (&tty, posix_baudrate);
+ cfsetispeed (&tty, posix_baudrate);
+
+ tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars
+ // disable IGNBRK for mismatched speed tests; otherwise receive break
+ // as \000 chars
+ tty.c_iflag &= ~IGNBRK; // disable break processing
+ tty.c_lflag = 0; // no signaling chars, no echo,
+ // no canonical processing
+ tty.c_oflag = 0; // no remapping, no delays
+ tty.c_cc[VMIN] = 0; // read doesn't block
+ tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
+
+ tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
+
+ tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
+ // enable reading
+ tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
+ tty.c_cflag |= parity;
+ tty.c_cflag &= ~CSTOPB;
+ tty.c_cflag &= ~CRTSCTS;
+
+ if (tcsetattr (fd, TCSANOW, &tty) != 0)
+ {
+ return -1;
+ }
+ return 0;
+}
+
+
+void set_blocking (int b, int should_block)
+{
+ struct termios tty;
+ memset (&tty, 0, sizeof tty);
+ if (tcgetattr (b, &tty) != 0)
+ {
+ return;
+ }
+
+ tty.c_cc[VMIN] = should_block ? 1 : 0;
+ tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
+
+ //if (tcsetattr (fd, TCSANOW, &tty) != 0)
+ // error_message ("error %d setting term attributes", errno);
+}
+
+int open_serial(int handle,int port, int baudrate){
+ char* portname;
+ //printf("%d\n",port);
+ int OK;
+ switch(port){
+ case 0: portname = "//dev/ttyACM0";break;
+ case 1: portname = "//dev/ttyACM1";break;
+ case 2: portname = "//dev/ttyACM2";break;
+ case 3: portname = "//dev/ttyACM3";break;
+ case 4: portname = "//dev/ttyACM4";break;
+ case 5: portname = "//dev/ttyACM5";break;
+ case 6: portname = "//dev/ttyACM6";break;
+ case 7: portname = "//dev/ttyACM7";break;
+ //default : return 2;
+ }
+ OK = 0;
+ //printf("%s\n",portname);
+ fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC);
+ //fd = open (portname, O_RDWR | O_NOCTTY); //srikant
+ //printf("%d\n",fd);
+ if (fd < 0)
+ {
+ OK=2;
+ return OK;
+ }
+ set_interface_attribs (fd, baudrate, 0);
+ set_blocking (fd, 0); // set no blocking
+ //printf("Program running with status : %d\n",OK);
+ return OK;
+}
+
+int close_serial(int handle){
+ //usleep(1000);
+ close(fd);
+ //printf("Program closing....\n");
+ return 0;
+}
+
+int write_serial(int handle, char str[],int size){
+ if(write(fd, str, size)!=-1)
+ {
+ //printf("serial write started.\n");
+ //printf("%s\n",str );
+ //printf("%d\n",(int)str[0] );
+ }
+ usleep(size*100);
+ return 0;
+}
+
+
+int status_serial(int handle,int nb[]){
+ nb[0] = 2;
+ nb[1] = 2;
+ int OK=0;
+ //printf("Getting status.....\n");
+ return OK;
+}
+
+int read_serial(int handle,char buf[],int size){
+
+ char readbuf[size+1];
+ //int fl=tcflush(fd,TCOFLUSH);
+ //int fl=ioctl(fd,I_FLUSH,FLUSHW);
+ if(read(fd, readbuf, size)!=-1)
+ {
+ readbuf[size]='\0';
+ int i;
+ for (i = 0; i < size; ++i)
+ {
+ buf[i]=(readbuf[i]);
+ //printf("%u\n",buf[i] );
+ }
+ buf[size]='\0';
+ //printf("Reading has commenced..\n");
+ //printf("%d\n",(int)strlen(readbuf));
+ //printf("%s\n",readbuf);
+ return 0;
+ }
+ else
+ return 2 ;
+}
+/*void read_serial(int *handle,char buf[],int *size){
+ read(fd, buf, *size);
+ printf("Reading has commenced..\n");
+}*/