Linux c: Serial port settings
Serial operation is no more than the following:
1 Open
2 Setting the serial port properties
3 Read Write
struct Termios can show all the serial port properties, which are not explained in detail here.
See "Linux Open Class" Serial port property settings http://mp.weixin.qq.com/s?src=3×tamp=1467340907&ver=1&signature= 2hx5ros7br3*gbjvmzq0om2x3kmaonfwdt1sspb2fmdoc68n3k6nqofousmf3uwy8hmv58imyit4xiugpdsqvepsubo8osdt* bcwwuvgdqvsuypvfgz8arph5*9qxamrlcafmopa9fk42fwijitw6a==
and the Linux application development http://hilinux.com/man/linuxdev/ch09.html, this article has done the detailed explanation to the serial port structure body
struct Termios {
tcflag_t C_iflag; /* Input Parameters */
tcflag_t C_oflag; /* OUTPUT Parameters */
tcflag_t C_cflag; /* Control parameters */
tcflag_t C_ispeed; /* Input baud rate */
tcflag_t C_ospeed; /* Output baud rate */
cc_t C_line; /* Line Control */
cc_t C_cc[nccs]; /* Control characters */
};
Xereno The serial code is too Fanluan, only to do the contrast to confirm with.
Here is a snippet of network code for analysis:
Serial Port Operation Example
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/termios.h>
#include "serial.h"
#define DEV_NAME "/dev/ttys1"
int set_port_attr (int fd,int baudrate, int databit, const char *stopbit, char parity, int vtime,int vmin);
static void Set_baudrate (struct termios *opt, unsigned int baudrate);
static void Set_data_bit (struct termios *opt, unsigned int databit);
static void Set_stopbit (struct Termios *opt, const char *stopbit);
static void Set_parity (struct termios *opt, char parity);
int main (int argc, char *argv[])
{
int FD;
int Len, I,ret;
Char buf[] = "Hello zlg!";
FD = open (Dev_name, O_RDWR | O_noctty);
if (FD < 0) {
Perror (Dev_name);
return-1;
}
ret = set_port_attr (FD, B115200, 8, "1", ' N ', 150,255); /* 115200 8N1 */
if (Ret < 0) {
printf ("set UART ARRT faile \ n");
Exit (-1);
}
Len = Write (fd, buf, sizeof (BUF)); /* Send string to serial port */
if (Len < 0) {
printf ("Write data error \ n");
return-1;
}
Len = Read (fd, buf, sizeof (BUF)); /* Read string in serial port */
if (Len < 0) {
printf ("read error \ n");
return-1;
}
printf ("%s \ n", buf); /* Print the string read in the serial port */
return (0);
}
The custom Terminal property setting function is defined as follows
When setting terminal properties, note that some items are passed with &, while others are through or |. Don't confuse misunderstandings.
int set_port_attr (int fd,int baudrate, int databit, const char *stopbit, char parity, int vtime,int vmin)
{
struct Termios opt;
Tcgetattr (FD, &opt); Get Initial settings
Set_baudrate (&opt, baudrate);
Set_data_bit (&opt, databit);
Set_parity (&opt, parity);
Set_stopbit (&opt, stopbit);
Opt.c_cflag &= ~crtscts;//does not use hardware flow control
Opt.c_cflag |= clocal | Cread; clocal--Ignore modem control line, local connection, no data machine control function, cread--enable to receive the flag
/*
ixon--Xon/xoff flow control with output enabled
ixoff--Xon/xoff flow control with input enabled
ixany--allows any character to start the output again
igncr--Ignore carriage return in input
*/
Opt.c_iflag &= ~ (Ixon | Ixoff | Ixany);
Opt.c_oflag &= ~opost; Enable output processing
/*
icanon--Enable standard mode (canonical modes). Allows the use of special characters EOF, EOL,
EOL2, ERASE, KILL, Lnext, reprint, STATUS, and Werase, as well as buffer by row.
echo--echo Input characters
echoe--if Icanon is set at the same time, the character ERASE erase the previous input character, Werase erase the previous word
isig--when receiving a character INTR, QUIT, SUSP, or DSUSP, generate the corresponding signal
*/
Opt.c_lflag &= ~ (Icanon | ECHO | Echoe | ISIG);
Opt.c_cc[vmin] = VMIN; To set the timeout length and minimum number of characters in non-canonical mode:
Opt.c_cc[vtime] = Vtime; Vtime in conjunction with Vmin, which is the maximum time limit for transmission or waiting
Tcflush (FD, Tciflush); /* tciflush--update the options and do it now */
Return (Tcsetattr (FD, Tcsanow, &opt)); /* tcsanow--change occurs immediately */
}
Custom Set_baudrate () function
Use the Set_baudrate () function to set the serial port input/output baud rate to 115200 for the code: set_baudrate (&opt, B115200));
In general, the serial port input and output baud rate are set to the same value, if you want to set up separately, you need to call Cfsetispeed, Cfsetospeed
static void Set_baudrate (struct termios *opt, unsigned int baudrate)
{
Cfsetispeed (opt, baudrate);
Cfsetospeed (opt, baudrate);
}
Custom Set_stopbit functions
In the Set_stopbit () function, the Stopbit parameter can take the following values: "1" (1-bit stop bit), "1.5" (1.5-bit stop bit), and "2" (2-bit stop bit).
static void Set_stopbit (struct Termios *opt, const char *stopbit)
{
if (0 = = strcmp (stopbit, "1")) {
Opt->c_cflag &= ~CSTOPB; /* 1-bit stop bit t */
} else if (0 = = strcmp (stopbit, "1.5")) {
Opt->c_cflag &= ~CSTOPB; /* 1.5-bit stop bit */
}else if (0 = = strcmp (Stopbit, "2")) {
Opt->c_cflag |= CSTOPB; /* 2-bit stop bit */
}else {
Opt->c_cflag &= ~CSTOPB; /* 1-bit stop bit */
}
}
Set_data_bit function
csize--the character length mask. Values are CS5, CS6, CS7, or CS8
static void Set_data_bit (struct termios *opt, unsigned int databit)
{
Opt->c_cflag &= ~csize;
Switch (databit) {
Case 8:
Opt->c_cflag |= CS8;
Break
Case 7:
Opt->c_cflag |= CS7;
Break
Case 6:
Opt->c_cflag |= CS6;
Break
Case 5:
Opt->c_cflag |= CS5;
Break
Default
Opt->c_cflag |= CS8;
Break
}
}
set_parity function
In the Set_parity function, the parity parameter can be evaluated as: ' n ' and ' n ' (no parity), ' e ' and ' e ' (for parity), ' o ', and ' O ' (for the odd checksum).
static void Set_parity (struct termios *opt, char parity)
{
Switch (parity) {
Case ' N ':/* No check */
Case ' n ':
Opt->c_cflag &= ~parenb;
Break
Case ' E ':/* parity check */
Case ' E ':
Opt->c_cflag |= Parenb;
Opt->c_cflag &= ~parodd;
Break
Case ' O ':/* odd Check */
Case ' O ':
Opt->c_cflag |= Parenb;
Opt->c_cflag |= ~parodd;
Break
Default:/* Other options are no check */
Opt->c_cflag &= ~parenb;
Break
}
}
Linux serial Programming (c)