how to get data from serial_port?

hi,I want to get data from serial_port,where to find the articles
about how to initial the port .thanks!

jgp <gpjin@nairc.ac.cn> wrote:

hi,I want to get data from serial_port,where to find the articles
about how to initial the port .thanks!

The basic is:

fd = open("/dev/ser1", O_RDWR);
read(fd, buf, bufsize);
write(fd, buf, bufsize);
close(fd);

For setting tty related params, tc*, especialy tcgetaddr(), tcsetaddr().
Or if you are asking utils, stty is the one used to change tty paramaters.

-xtang

Isn’t that tcgetattr() and tcsetattr().


Bill Caroselli – 1(530) 510-7292
Q-TPS Consulting
QTPS@EarthLink.net


“Xiaodan Tang” <xtang@qnx.com> wrote in message
news:9tj3eu$86h$1@nntp.qnx.com

jgp <> gpjin@nairc.ac.cn> > wrote:
hi,I want to get data from serial_port,where to find the articles
about how to initial the port .thanks!

The basic is:

fd = open("/dev/ser1", O_RDWR);
read(fd, buf, bufsize);
write(fd, buf, bufsize);
close(fd);

For setting tty related params, tc*, especialy tcgetaddr(), tcsetaddr().
Or if you are asking utils, stty is the one used to change tty paramaters.

-xtang

Bill Caroselli <qtps@earthlink.net> wrote:

Isn’t that tcgetattr() and tcsetattr().

Yes. Sorry my fingers are more formaliar with “addr” :slight_smile:

-xtang


Bill Caroselli – 1(530) 510-7292
Q-TPS Consulting
QTPS@EarthLink.net



“Xiaodan Tang” <> xtang@qnx.com> > wrote in message
news:9tj3eu$86h$> 1@nntp.qnx.com> …
jgp <> gpjin@nairc.ac.cn> > wrote:
hi,I want to get data from serial_port,where to find the articles
about how to initial the port .thanks!

The basic is:

fd = open("/dev/ser1", O_RDWR);
read(fd, buf, bufsize);
write(fd, buf, bufsize);
close(fd);

For setting tty related params, tc*, especialy tcgetaddr(), tcsetaddr().
Or if you are asking utils, stty is the one used to change tty paramaters.

-xtang

thanks!
if I want to initial the serial-port to be;
9600bps,8 bit data,1 bit stop-bit,no parity.
who can tell me how to set the stop_bit to be 1?

cfsetispeed(&termios_p, 9600); // input
termios_p.c_cflag &= ~CSIZE;
termios_p.c_cflag |= CS8|CREAD |?




Xiaodan Tang <xtang@qnx.com> wrote in message
news:9tn0lg$lg8$1@nntp.qnx.com

Bill Caroselli <> qtps@earthlink.net> > wrote:
Isn’t that tcgetattr() and tcsetattr().

Yes. Sorry my fingers are more formaliar with “addr” > :slight_smile:

-xtang


Bill Caroselli – 1(530) 510-7292
Q-TPS Consulting
QTPS@EarthLink.net


“Xiaodan Tang” <> xtang@qnx.com> > wrote in message
news:9tj3eu$86h$> 1@nntp.qnx.com> …
jgp <> gpjin@nairc.ac.cn> > wrote:
hi,I want to get data from serial_port,where to find the articles
about how to initial the port .thanks!

The basic is:

fd = open("/dev/ser1", O_RDWR);
read(fd, buf, bufsize);
write(fd, buf, bufsize);
close(fd);

For setting tty related params, tc*, especialy tcgetaddr(),
tcsetaddr().
Or if you are asking utils, stty is the one used to change tty
paramaters.

-xtang

Previously, diamond wrote in qdn.public.articles:

thanks!
if I want to initial the serial-port to be;
9600bps,8 bit data,1 bit stop-bit,no parity.
who can tell me how to set the stop_bit to be 1?

cfsetispeed(&termios_p, 9600); // input
termios_p.c_cflag &= ~CSIZE;
termios_p.c_cflag |= CS8|CREAD |?

termios_p.c_cflag &= ~CSTOPB;



Xiaodan Tang <> xtang@qnx.com> > wrote in message
news:9tn0lg$lg8$> 1@nntp.qnx.com> …
Bill Caroselli <> qtps@earthlink.net> > wrote:
Isn’t that tcgetattr() and tcsetattr().

Yes. Sorry my fingers are more formaliar with “addr” > :slight_smile:

-xtang


Bill Caroselli – 1(530) 510-7292
Q-TPS Consulting
QTPS@EarthLink.net


“Xiaodan Tang” <> xtang@qnx.com> > wrote in message
news:9tj3eu$86h$> 1@nntp.qnx.com> …
jgp <> gpjin@nairc.ac.cn> > wrote:
hi,I want to get data from serial_port,where to find the articles
about how to initial the port .thanks!

The basic is:

fd = open("/dev/ser1", O_RDWR);
read(fd, buf, bufsize);
write(fd, buf, bufsize);
close(fd);

For setting tty related params, tc*, especialy tcgetaddr(),
tcsetaddr().
Or if you are asking utils, stty is the one used to change tty
paramaters.

-xtang

\

hi,here is my code ,when I run ./a.out under QNX4.25.
It just print some information anout the settings of serial_port,
but no data received from serial_port as expected.what’s wrong?
Is there anything to do with the configure of hardware?



9600baud,8 bit data,1bit stop.

thank you all the same.


#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <sys/dev.h>
#include <sys/uio.h>

#define SERDEV1 “/dev/ser1”
#define BAUD 9600

int open_device (char *device);
void serial_device_init(int file_des);
void read_device (int file_des);

main()
{
int file_des;

file_des = open_device (SERDEV1);
serial_device_init (file_des);
for(;:wink:
read_device (file_des);
}

int open_device (char *device)
{
int file_des;
struct _dev_info_entry info;

if ((file_des = open(device, O_RDWR)) = -1{
printf(“error opening %s: %s\n”,
device, strerror(errno));
exit(1);
}
if(dev_info(file_des, &info) != -1)
printf(“NODE %d, TTY %d\n”, info.nid, info.tty);
else
printf(“dev_info failed\n”,strerror(errno));
return(file_des);
}
void serial_device_init(int file_des)
{
int i;
struct termios termios_p;
speed_t speed = BAUD;

// get the control structure for /dev/ser1

tcgetattr(file_des, &termios_p);
/* get control structure for /dev/ser1 */

// Set the baud (will he set with tcsetattr())

cfsetispeed(&termios_p, speed); // input


// Control modes:
//
// CS8----> 8 bits-per-byte
// CREAD–> Enable receiver. If this bit is not set,
// no characters are received.
// no parity

termios_p.c_cflag &= ~CSIZE;
termios_p.c_cflag |= CS8|CREAD;
termios_p.c_cflag &=~CSTOPB;

// disable all control characters in the c_cc array

for (i = 0; i <NCCS; i++)

termios_p.c_cc _= PC_VDISABLE;

// Apply the settings immediately

tcsetattr(file_des, TCSANOW, &termios_p);
tcgetattr(file_des, &termios_p);

// Print out some status information

printf(“Input modes %lu\n”, termios_p.c_iflag);
printf(“Output modes %lu\n”, termios_p.c_oflag);
printf(“Control modes %lu\n”, termios_p.c_cflag);
printf(“Local modes %lu\n”, termios_p.c_lflag);
printf(“Device Status %d\n”, termios_p.c_status);
printf(“QNX spec flags %d\n”, termios_p.c_qflag);
}

void read_device (int file_des)
{
int bytes;
char readbuf[1]={0};
int i;

// Read from the serial port

if((bytes = dev_read(file_des, &readbuf,
1, 1, 0, 0, 0, NULL)) = -1)
printf(“error on dev_read %s\n”, strerror(errno));
else{
printf(“bytes read is %d\n”, bytes);
for (i=0; i<bytes; i++)
printf("\tbyte_read = %o\n", readbuf, i);

}
}

One problem might be that you use 9600 as a speed value.
Legal speed values are declared in termios.h
So, it must be:

#define BAUD B9600

Also, you don’t specify if your line is going to be in canonical
or raw mode. In canonical mode serial driver will do nothing until it
gets newline character. Canonical mode is enabled by ICANON bit .

“diamond” <gpjin@nairc.ac.cn> ÓÏÏÂÝÉÌ/ÓÏÏÂÝÉÌÁ × ÎÏ×ÏÓÔÑÈ ÓÌÅÄÕÀÝÅÅ:
news:9uvo9c$4rj$1@inn.qnx.com

hi,here is my code ,when I run ./a.out under QNX4.25.
It just print some information anout the settings of serial_port,
but no data received from serial_port as expected.what’s wrong?
Is there anything to do with the configure of hardware?



9600baud,8 bit data,1bit stop.

thank you all the same.


#include <string.h
#include <errno.h
#include <fcntl.h
#include <unistd.h
#include <stdlib.h
#include <stdio.h
#include <termios.h
#include <sys/dev.h
#include <sys/uio.h

#define SERDEV1 “/dev/ser1”
#define BAUD 9600

int open_device (char *device);
void serial_device_init(int file_des);
void read_device (int file_des);

main()


int file_des;

file_des = open_device (SERDEV1);
serial_device_init (file_des);
for(;:wink:
read_device (file_des);
}

int open_device (char *device)


int file_des;
struct _dev_info_entry info;

if ((file_des = open(device, O_RDWR)) =

printf(“error opening %s: %s\n”,
device, strerror(errno));
exit(1);
}
if(dev_info(file_des, &info) != -1)
printf(“NODE %d, TTY %d\n”, info.nid, info.tty);
else
printf(“dev_info failed\n”,strerror(errno));
return(file_des);
}
void serial_device_init(int file_des)


int i;
struct termios termios_p;
speed_t speed = BAUD;

// get the control structure for /dev/ser1

tcgetattr(file_des, &termios_p);
/* get control structure for /dev/ser1 */

// Set the baud (will he set with tcsetattr())

cfsetispeed(&termios_p, speed); // input


// Control modes:
//
// CS8----> 8 bits-per-byte
// CREAD–> Enable receiver. If this bit is not set,
// no characters are received.
// no parity

termios_p.c_cflag &= ~CSIZE;
termios_p.c_cflag |= CS8|CREAD;
termios_p.c_cflag &=~CSTOPB;

// disable all control characters in the c_cc array

for (i = 0; i <NCCS; i++)

termios_p.c_cc > _= PC_VDISABLE;

// Apply the settings immediately

tcsetattr(file_des, TCSANOW, &termios_p);
tcgetattr(file_des, &termios_p);

// Print out some status information

printf(“Input modes %lu\n”, termios_p.c_iflag);
printf(“Output modes %lu\n”, termios_p.c_oflag);
printf(“Control modes %lu\n”, termios_p.c_cflag);
printf(“Local modes %lu\n”, termios_p.c_lflag);
printf(“Device Status %d\n”, termios_p.c_status);
printf(“QNX spec flags %d\n”, termios_p.c_qflag);
}

void read_device (int file_des)


int bytes;
char readbuf[1]={0};
int i;

// Read from the serial port

if((bytes = dev_read(file_des, &readbuf,
1, 1, 0, 0, 0, NULL)) = -1)
printf(“error on dev_read %s\n”, strerror(errno));

e{
printf(“bytes read is %d\n”, bytes);
for (i=0; i<bytes; i++)
printf("\tbyte_read = %o\n", readbuf> , i);

}
}











\