Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Serial Port and IO Termination

by diskcrash (Hermit)
on Jul 21, 2003 at 00:04 UTC ( #276111=snippet: print w/replies, xml ) Need Help??
Description: Greetings Hearty Monks,

From time to time I have battered my head against my favorite I/O device, the ubiquitous RS-232 Serial Port. I think I have probably wasted at least 100 days of my life (I am old...) in this endeavour. But usually I am rewarded with data victory. As was a recent case. I had built an interface for my Aware Electronics Geiger Counter (RM-70) that used a Basic Stamp IISX chip set. Every 20 seconds it would spit out an ASCII string of radiation and temperature data. I had hunted around for examples using the Device::SerialPort module and found many. Most were copies of code used to read PBX data. But it wouldn't work. Ouch. Finally, after much research I realized that - by golly - you had to terminate the IO with a new line and not a carriage return. Oddly doing a cat </dev/ttyS0 worked, which faked me out. So I added the line in the tty setup below that converts CR to NL and zap-ity-do-dah it started terminating and sending each read. Long live RS-232. Please send along any suggestions and improvements. This also probably explains why I had failed to get good reads from a cheap-o RS-232 capable DVM a few years ago.

This was done in Perl 5.8.0 under RH Linux 9.0.

Blessings of the Church and State be upon you

# Author: David Drake
# Date:   July 18, 2003
# Requirements: Device::SerialPort 0.22 (from cpan  July 2003)
# Version: 1.0
#This script is used to read a serial port to obtain data from a
#combined Geiger counter and temperature sensor.
#The Geiger Counter is an Aware Electronics RM-70 unit. Each count
#maps to one microR per hour. The RM-70 pulse output is sent to a
#Basic Stamp-IISX microcontroller. The BS2SX accumulates counts for 20
#seconds and then sends a serial data stream out of its serial port.
#The data stream goes into the input serial port on the Linux system.
#This program then tabulates the data to a log file.

use Device::SerialPort;
use Time::gmtime;

$LOGDIR    = "/home/drake/SerialPort_files";             # path to dat
+a file
$LOGFILE   = "geiger.log";              # file name to output to
$PORT      = "/dev/ttyS0";              # port to watch

# Serial Settings

#make the serial port object
#note the need to convert carriage returns to new lines to terminate e

$ob = Device::SerialPort->new ($PORT) || die "Can't Open $PORT: $!";

$ob->baudrate(9600)   || die "failed setting baudrate";
$ob->parity("none")    || die "failed setting parity";
$ob->databits(8)       || die "failed setting databits";
$ob->stty_icrnl(1)     || die "failed setting convert cr to new line" 
$ob->handshake("none") || die "failed setting handshake";

$ob->write_settings    || die "no settings";

# open the logfile, and Port

  ||die "can't open smdr file $LOGDIR/$LOGFILE for append: $SUB $!\n";

select(LOG), $| = 1;    # set nonbuffered mode, gets the chars out NOW

open(DEV, "<$PORT") || die "Cannot open $PORT: $_";

# Loop forver, logging data to the log file

while($_ = <DEV>){        # print input device to file
        $gmc = gmctime();
        print LOG $gmc," ",$_;

undef $ob;

#we are done dude
Replies are listed 'Best First'.
Re: Serial Port and IO Termination
by Anonymous Monk on Mar 06, 2009 at 11:03 UTC
    Hi I tried using this for COM4 it is not wokring
Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://276111]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (7)
As of 2016-09-29 11:26 GMT
Find Nodes?
    Voting Booth?
    Extraterrestrials haven't visited the Earth yet because:

    Results (552 votes). Check out past polls.