1. 8N1
8:表明8位数据位
N: 表明NO,既无奇偶校验
1:表明一位停止位
2. 代码中关于串口的设置
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char*argv[])
{
struct termios termOptions;
int ret,i;
char c = 1 ;
char recv_buf[1024];
int fd=open("/dev/ttyUSB0", O_RDWR); //usb转串口
//获取当前的串口配置
tcgetattr(fd, &termOptions);
//配置控制位: Set8bit data,No parity,stop 1 bit(8N1)
termOptions.c_cflag &= ~PARENB; //设为没有奇偶校验: no parity
termOptions.c_cflag &= ~CSTOPB; //设为1个停止位:1 stop bit
termOptions.c_cflag &= ~CSIZE; //设置字符长度之前,先清字符长度位
termOptions.c_cflag |= CS8 | CLOCAL | CREAD; //设为8个数据位, 本地连接, 可以接收字符
termOptions.c_cflag &= ~CRTSCTS; //不启用硬件流控制
//配置输入位
termOptions.c_iflag &= ~(INLCR | ICRNL | IXON | IXOFF | IXANY); //禁止(INLCR将NL换行转为CR回车 ICRNL将回车转为换行)
//配置输出位
termOptions.c_oflag &= ~OPOST; //禁止 (处理后输出)
//配置local
termOptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //禁止 (ICANON使用标准输入模式, ECHO显示输入字符)
tcflush(fd,TCIFLUSH); //刷清未决输入和输出
termOptions.c_cc[VTIME] = 10; /* inter-character timer unused, wait 1s, if no data, return */
termOptions.c_cc[VMIN] = 0; /* blocking read until 0 character arrives */
printf("c_lflag=%x,c_iflag=%x,c_oflag=%x\n",termOptions.c_lflag,termOptions.c_iflag, termOptions.c_oflag);
//cfsetospeed(&termOptions, B115200);
//cfsetispeed(&termOptions, B115200);
cfsetispeed(&termOptions, B19200); //设置输入波特率
cfsetospeed(&termOptions, B19200); //设置输出波特率
tcsetattr(fd, TCSANOW, &termOptions);
while(1)
{
ret = write(fd, &c, 1);
if(ret < 0)
printf("write error\n");
memset(recv_buf, 0, sizeof(recv_buf));
ret = read(fd, recv_buf, sizeof(recv_buf));
if(ret < 0)
printf("read error\n");
printf("%s", recv_buf);
sleep(1);
}
return 0;
}
2.1 代码
9uart.rar (下载后改名为9uart.tar.gz)
2.2 关于struct termios
/usr/include/x86_64-linux-gnu/bits/termios.h
typedef unsigned char cc_t;
typedef unsigned int speed_t;
typedef unsigned int tcflag_t;
#define NCCS 32
struct termios
{
tcflag_t c_iflag; //input mode flags: 输入设置
tcflag_t c_oflag; //output mode flags:输出设置
tcflag_t c_cflag; //control mode flags: 控制设置
tcflag_t c_lflag; // local mode flags
cc_t c_line; // line discipline
cc_t c_cc[NCCS]; // control characters
speed_t c_ispeed; // input speed
speed_t c_ospeed; // output speed
}
注意: 各个flags的宏定义都是8进制的,例如:
/* c_iflag bits */
#define INLCR 0000100 --> 16进制: 0x40
#define IGNCR 0000200
#define ICRNL 0000400 --> 16进制:0x100
#define IUCLC 0001000
#define IXON 0002000 --> 16进制: 0x80
二.非标准输入处理
2.1 不输入回车也可以收到一个个字符
cong@msi:/work/test/busytest/10uart$ cat serial.c
#include
#include
#include
int main()
{
int c = 0;
FILE * in;
struct termios oldtm,newtm;
in = fopen("/dev/tty","r");
tcgetattr(fileno(in),&oldtm);
newtm=oldtm;
newtm.c_lflag &= ~ICANON; //不使用标准行处理模式,这样不输入回车也可以接收到一个个的字符了
// newtm.c_lflag &= ~ECHO; //不回显,输入的字符不显示出来
// newtm.c_cc[VMIN] = 1;
// newtm.c_cc[VTIME] = 0;
<