Writing to a Serial Port


 
Thread Tools Search this Thread
Top Forums Web Development Writing to a Serial Port
# 50  
Old 10-30-2014
Okay, so minicom is using serial port timeouts. Let's see how that works for this.

Code:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdio.h>
#include <string.h>

#define STDOUT_FILENO 1

int main() {
        const char *str="W\r\n";
        char buf[64];
        int pos=0;

        int fd=open("/dev/ttyS0", O_RDWR);
        if (fd < 0) {
            perror("Couldn't open");
        }

        // These WERE saved from when minicom was running, right?
        system("stty -F /dev/ttyS0 1:0:80000dad:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");

        write(fd, str, strlen(str));

        fprintf(stderr, "Wrote W\n");

        tcdrain(fd);

        while(read(fd, buf+pos, 1) == 1)
        {
                fprintf(stderr, "Read 0x%02x\n", (unsigned char)buf[pos]);
                if(buf[pos++] == '\n') break;
        }

        buf[pos]='\0';

        printf("got line:\n%s", buf);
}

If "W\r\n" doesn't work try "W\n"

You can't remote into your machine? Trial-and-error with a 24 hour delay between trials...
This User Gave Thanks to Corona688 For This Post:
# 51  
Old 10-31-2014
Corona688 -

Thanks.

// These WERE saved from when minicom was running, right? - Regrettably no.

I'll make the appropriate changes in the C program when I get home [approx 8pm EST] and keep you posted.

---------- Post updated at 06:27 PM ---------- Previous update was at 12:23 PM ----------

Corona688 -

Thanks -

You can't remote into your machine? Trial-and-error with a 24 hour delay between trials...
Free standing computer at home. Can't remote into it from my other job.

Sorry

---------- Post updated at 11:45 PM ---------- Previous update was at 06:27 PM ----------

IT WORKS!!

The thing that did it, as you sugessted was to initialize the port in the program.

Here is your code, as modified -

Code:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdio.h>
#include <string.h>

#define STDOUT_FILENO 1
#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyS0"


int main(void) 
{

        const char *str="W\r\n";
        char buf[64];
        int pos=0;
        int n;
        char buff[20];
        FILE *fp1, *fp2;   
        

        fp1 = fopen(MODEMDEVICE, "w+");
        system("stty -F /dev/ttyS0 1:0:80000dad:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");

        fp2 = fopen("testfile.txt", "w+");

        fprintf(fp1, "%s","W\r\n");
        fread(buff,7,1, fp1);
        rewind(fp2);
        fwrite(buff, 1, 7,fp2 );

}

It even works in my original program -

Code:
       #include <stdio.h>
       #include <fcntl.h>
       #include <sys/stat.h>
       #include <termios.h>
       #include <string.h>

        #define BAUDRATE B9600
        #define MODEMDEVICE "/dev/ttyS0"

        int main(void)
        {
            int n;
            char buff[20];

            FILE *fp1, *fp2;

            system("stty -F /dev/ttyS0 1:0:80000dad:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");
 
            fp1 = fopen(MODEMDEVICE, "w+");

            if(fp1 == NULL)
            {
                printf("initiation error. \n");
                return 1;
            }

            fp2 = fopen("testfile.txt", "w+");

            fprintf(fp1, "%s","W\r\n");
            fread(buff,7,1, fp1);
            rewind(fp2);
            fwrite(buff, 1, 7,fp2 );
        }

and in the PHP script...

PHP Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<html>

    <head>
        <title>Test Scale</title>
    </head>
        <body>
        <strong>
            <div align='center'>
                  <h3>Test Scale</h3>
            </strong>
                    </div>

<?php
            error_reporting
(E_ALL E_NOTICE);
            
ini_set('display_errors','1');
            echo 
'hello';
            
$output = `/var/www/scale4`;
            echo 
$output;
            
?>

        </body>
</html>
I thank all of you for your patience and help. This lifts a tremendous burden off my head!!!
This User Gave Thanks to Meow613 For This Post:
# 52  
Old 10-31-2014
There is one set of final tests to do now.

You have experienced a random power down on the computer side so you now need to randomly power down the scales.

Then check to see if you still have the two talking when you power thst scales back up.

Similarly simulate a break in comms by disconnecting the the serial port to the outside world whilst in use and if needed code to suit.

These are real world events.

(Nice one Corona688.)
# 53  
Old 10-31-2014
I am very glad that it works for you! Smilie

...but you should not be using stdio for device files! I used open/read/write/close for a reason!

stdio is just not meant for that. At the very least, please disable the line-buffer with setvbuf to prevent it from freezing when absolutely nothing's wrong...

system("stty"); almost feels like cheating, but sometimes, the C way is just not worth fighting with.

Last edited by Corona688; 10-31-2014 at 12:49 PM..
This User Gave Thanks to Corona688 For This Post:
# 54  
Old 11-02-2014
wisecracker -

Similarly simulate a break in comms by disconnecting the the serial port to the outside world whilst in use and if needed code to suit.
FAILED

I cannot even access the COM with minicom.. ugh
I will not even try to simulate a power failure until this is solved.

Thanks for your "real world" tests.

---------- Post updated at 12:16 AM ---------- Previous update was at 12:03 AM ----------

Another Note -

It requires minicom to be running for the program to work. If I disconnect the COMM, minicom can only be activated by closing it and restarting.

Thanks for the testing
# 55  
Old 11-02-2014
Welcome to the real world... ;o)

You might have to do a compete power down and cold start of the computer to _reset_ the port and gain full access again.

Quote:
It requires minicom to be running for the program to work. If I disconnect the COMM, minicom can only be activated by closing it and restarting.
Is this a function of the forced error or have you found it out by _accident_?
# 56  
Old 11-02-2014
wisecracker -

The real world can be nasty!

This C code dies with a segmentation fault.

Code:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdio.h>
#include <string.h>

#define STDOUT_FILENO 1
#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyS0"


int main(void) 
{

        const char *str="W\r\n";
        char buf[64];
        int pos=0;
        int n, i, d ;
        char buff[20];
        FILE *fp1, *fp2;   
        
        fp1 = open("/dev/ttyS0", O_RDWR);
        if (d < 0) 
        {
            perror("Couldn't open");
        }

        system("stty -F /dev/ttyS0 1:0:80000dad:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");

        fp2 = fopen("/var/www/testfile.txt", "w+");

        fprintf(fp1, "%s","W\r");
        fread(buff,7,1, fp1);
        printf("buffer elements\n");
        for(i= 0; i < strlen(buff) + 1;i++)
            printf("%c", buff[i]);
         printf("You entered the string %s\n",buff);
        rewind(fp2);
        fwrite(buff, 1, 7,fp2 );

}

Here is the PHP script that is being called...

PHP Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<html>

    <head>
        <title>Test Scale</title>
    </head>
        <body>
        <strong>
            <div align='center'>
                  <h3>Test Scale</h3>
            </strong>
                    </div>

<?php
            error_reporting
(E_ALL E_NOTICE);
            
ini_set('display_errors','1');

            
$output = `/var/www/scale4`;
            
$fptr1=  fopen("/var/www/testfile.txt""r");
            
$bla fscanf($fptr1,"%f"); //the data is always on the 2nd line
            
$weightfscanf($fptr1,"%f");
            
print_r($weight);
            
var_dump($weight);
            echo 
$weight[0];
?>

        </body>
</html>
This hopefully will be a commercial product, a Point Of Sale system for grocery stores. A situation cannot occur that will require rebooting or resetting the system. Therefore the "real world tests" that you stated must be passed under almost all situations. A UPS will help in most of the situations, but the others???
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Solaris

Cabling and adapters to communicate to service processor serial port from Windows PC with USB port.

Hello, I have an unloaded T5140 machine and want to access the ILOM for the first time and subsequently the network port after that., and then load Solaris 10 the final January 2011 build. The first part is what confuses me -the cabling. I am coming from a Windows machine (w/appropriate... (5 Replies)
Discussion started by: joboy
5 Replies

2. Web Development

Setup Serial Port

I need to set a serial port to 9600 7E1. How do I accomplish this? I've tried every combination, with no luck. (6 Replies)
Discussion started by: Meow613
6 Replies

3. Shell Programming and Scripting

reading from and writing to serial port

hello all, please any one can provide me the shell script to write data to /dev/ttyS1 and read responce from /dev/ttyS1 and compare the responce to some string .. thnxx ---------- Post updated at 03:35 PM ---------- Previous update was at 11:46 AM ---------- any body help me.. how do i... (1 Reply)
Discussion started by: yashwantkumar
1 Replies

4. Solaris

How to enable Serial port on ILOM, when Network Port is enabled in parallel

Hi Everyone, In my environment, I have few T5220. On the iLOM Management Card, I have both Network and Serial port are cabled, I don't have any issues while I try to connect using Network Management port, but when I try to connect the serial port for the same server which is actually connected... (3 Replies)
Discussion started by: bobby320
3 Replies

5. Shell Programming and Scripting

Need help with serial port

Hi, I have a external board connected to my serial port. I need to execute "shutdown -r now" command when system boot up. When system boots up it requires a username ans password. Then I need to run my command. I can use rc script but that is rebooting system before it asks for username and... (0 Replies)
Discussion started by: charlie.arya
0 Replies

6. UNIX for Dummies Questions & Answers

Missing serial port

A neighbour's Ubuntu 10.04 machine has five serial ports, one on the motherboard and four on a PCI card. However, only four cards are showing: # dmesg | grep tty console enabled serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A ... (2 Replies)
Discussion started by: dotancohen
2 Replies

7. AIX

Serial port in AIX

Hi, How can i configure my modem in AIX thru serial port (sa0-->tty0) I have two port serial card configured as sa0 I created tty1 which port is tty0 and which port is tty1 how can i know?? (1 Reply)
Discussion started by: pchangba
1 Replies

8. Programming

How to tell if a string to serial port has been sent

I have a need to determine when a string has been completely sent via a serial port from a standard 'C' application. The code is as follows: SerialPort_Send = open (pPortString, O_WRONLY | O_NOCTTY | O_NONBLOCK); write (SerialPort_Send, pCommandString, strlen (pCommandString)); ... (2 Replies)
Discussion started by: ExDes
2 Replies

9. Solaris

Serial port not found

Hi, I am working with solaris 9,SUN-Blade-100 and I want to communicate with the Serial port.To check whether the port is working or not.I write code and when I execute the file,then I got the output-- According to this,serial port is not found.can anyone please tell me how to configure the... (1 Reply)
Discussion started by: smartgupta
1 Replies

10. Linux

urgent......Serial port

I think my serial port(on board) is not working ...... because when I am running same code on two machines its working good....but when my system comes into picture ....it doesnt show any output comming from serial port.......... can anybody tell me how to configure my serial port.........or to... (16 Replies)
Discussion started by: arunchaudhary19
16 Replies
Login or Register to Ask a Question