#查看串口中断号,设备路径等信息
dmesg | grep tty*
#查看串口中断号信息
cat /proc/tty/drivers/serial
#安装串口调试工具
sudo apt-get install minicom
#界面参数设置,crtl_A Z
#指令打开串口
sudo minicom -D /tty0
stty(set tty)命令用于检查和修改当前注册的终端的通信参数
$stty -F /dev/ttyTHS2
speed 9600 baud; line = 0;
-brkint -imaxbel
stty --help
Usage: stty [-F DEVICE | --file=DEVICE] [SETTING]...
or: stty [-F DEVICE | --file=DEVICE] [-a|--all]
or: stty [-F DEVICE | --file=DEVICE] [-g|--save]
-a, --all print all current settings in human-readable form
-g, --save print all current settings in a stty-readable form
-F, --file=DEVICE open and use the specified DEVICE instead of stdin
--help display this help and exit
--version output version information and exit
stty命令用法:https://blog.csdn.net/hxlawf/article/details/103611946
#读取串口数据,停止在读取的界面上
cat /dev/ttyUSB0
#分批次读取一定之间内的数据
stty -F /dev/ttyUSB0 raw speed 9600 min 0 time 10
#每次读取到的数据存储到一个文件
cat /dev/ttyUSB0 >> “tmpFile”
echo "hello world" > /dev/ttyUSB0
struct termio {
unsigned short c_iflag; /* input mode flags */
unsigned short c_oflag; /* output mode flags */
unsigned short c_cflag; /* control mode flags */
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};
在输入值传给程序之前控制其处理的方式
负责控制输出字元的处理方式
用于控制终端设备的硬件设置
主要用来控制终端设备不同的特色
符号下标 (初始值) 和意义(即c_cc[]数组对应下标的数值对应含义,如c_cc[VMIN] = 3):
这些符号下标值是互不相同的,除了 VTIME,VMIN 的值可能分别与 VEOL,VEOF 相同。 (在 non-canonical 模式下,特殊字符的含义更改为延时含义MIN 表示应当被读入的最小字符数。TIME 是以十分之一秒为单位的计时器。如果同时设置了它们,read 将等待直到至少读入一个字符,一旦读入 MIN 个字符或者从上次读入字符开始经过了 TIME 时间就立即返回。如果只设置了 MIN,read 在读入 MIN 个字符之前不会返回。如果只设置了 TIME,read 将在至少读入一个字符,或者计时器超时的时候立即返回。如果都没有设置,read 将立即返回,只给出当前准备好的字符。)
MIN与TIME组合有以下四种:
传送连续的 0 值比特流,持续一段时间,如果终端使用异步串行数据传输的话。如果 duration 是 0,它至少传输 0.25 秒,不会超过 0.5 秒。如果 duration 非零,它发送的时间长度由实现定义。
如果终端并非使用异步串行数据传输,tcsendbreak() 什么都不做。
等待直到所有写入 fd 引用的对象的输出都被传输。
丢弃要写入 引用的对象,但是尚未传输的数据,或者收到但是尚未读取的数据,取决于 queue_selector 的值:
TCIFLUSH :刷新收到的数据但是不读
TCOFLUSH :刷新写入的数据但是不传送
TCIOFLUSH :同时刷新收到的数据但是不读,并且刷新写入的数据但是不传送
挂起 fd 引用的对象上的数据传输或接收,取决于 action 的值:
TCOOFF :挂起输出
TCOON :重新开始被挂起的输出
TCIOFF :发送一个 STOP 字符,停止终端设备向系统传送数据
TCION :发送一个 START 字符,使终端设备向系统传输数据
打开一个终端设备时的默认设置是输入和输出都没有挂起。
被用来获取和设置 termios 结构中,输入和输出波特率的值。新值不会马上生效,直到成功调用了 tcsetattr() 函数。
设置速度为 B0 使得 modem “挂机”。与 B38400 相应的实际比特率可以用 setserial(8) 调整。
输入和输出波特率被保存于 termios 结构中。
cfmakeraw 设置终端属性如下:
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;
1.cfgetospeed() 返回 termios_p 指向的 termios 结构中存储的输出波特率
2.cfsetospeed() 设置 termios_p 指向的 termios 结构中存储的输出波特率为 speed。取值必须是以下常量之一:
B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B115200 B230400
其中:零值 B0 用来中断连接。如果指定了 B0,不应当再假定存在连接。通常,这样将断开连接。CBAUDEX 是一个掩码,指示高于 POSIX.1 定义的速度的那一些 (57600 及以上)。因此,B57600 & CBAUDEX 为非零。
3.cfgetispeed() 返回 termios 结构中存储的输入波特率。
4.cfsetispeed() 设置 termios 结构中存储的输入波特率为 speed。如果输入波特率被设为0,实际输入波特率将等于输出波特率。
RETURN VALUE 返回值
1.cfgetispeed() 返回 termios 结构中存储的输入波特率。
2.cfgetospeed() 返回 termios 结构中存储的输出波特率。
3.其他函数返回:
(1)0:成功
(2) -1:失败,
并且为 errno 置值来指示错误。
注意 tcsetattr() 返回成功,如果任何所要求的修改可以实现的话。因此,当进行多重修改时,应当在这个函数之后再次调用 tcgetattr() 来检测是否所有修改都成功实现
#include
#include /* File Control Definitions */
#include /* POSIX Terminal Control Definitions */
#include /* UNIX Standard Definitions */
#include /* ERROR Number Definitions */
int uart_int(void)
{
int fd;/*File Descriptor*/
/*------------------------------- Opening the Serial Port -------------------------------*/
fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY | O_NDELAY); /* ttyUSB0 is the FT232 based USB2SERIAL Converter |O_NDELAY */
/* O_RDWR - Read/Write access to serial port */
/* O_NOCTTY - No terminal will control the process */
/* Open in blocking mode,read will wait */
if(fd == -1) {
printf("\n Error! in Opening ttyUSB0 ");
return -1;
}
/*---------- Setting the Attributes of the serial port using termios structure --------- */
/*RX init*/
struct termios SerialPortSettings; /* Create the structure */
tcgetattr(fd, &SerialPortSettings); /* Get the current attributes of the Serial port */
/* Setting the Baud rate */
cfsetispeed(&SerialPortSettings, B115200); /* Set Read Speed as 9600*/
cfsetospeed(&SerialPortSettings, B115200); /* Set Write Speed as 9600*/
/* 8N1 Mode */
SerialPortSettings.c_cflag &= ~PARENB;/* Disables the Parity Enable bit(PARENB),So No Parity*/
SerialPortSettings.c_cflag &= ~CSTOPB;/* CSTOPB = 2 Stop bits,here it is cleared so 1 Stop bit*/
SerialPortSettings.c_cflag &= ~CSIZE;/* Clears the mask for setting the data size*/
SerialPortSettings.c_cflag |= CS8;/* Set the data bits = 8*/
SerialPortSettings.c_cflag &= ~CRTSCTS;/* No Hardware flow Control*/
SerialPortSettings.c_cflag |= CREAD | CLOCAL; /* Enable receiver,Ignore Modem Control lines*/
SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); /* Disable XON/XOFF flow control both i/p and o/p */
SerialPortSettings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* Non Cannonical mode*/
SerialPortSettings.c_oflag &= ~OPOST;/*No Output Processing raw format output*/
/* Setting Time outs */
SerialPortSettings.c_cc[VMIN] = 0; /* Read at least 10 characters */
SerialPortSettings.c_cc[VTIME] = 1; /* Wait indefinetly */
/* Set the attributes to the termios structure*/
if((tcsetattr(fd, TCSANOW, &SerialPortSettings)) != 0)
printf("\n ERROR ! in Setting attributes");
else
printf("\n BaudRate = 115200 \n StopBits = 1 \n Parity = none");
/*------------------------------- Read data from serial port -----------------------------*/
tcflush(fd, TCIFLUSH);/* Discards old data in the rx buffer*/
close(fd); /* Close the serial port */
return 0;
}
int main(void)
{
int fd;/*File Descriptor*/
printf("\n +----------------------------------+");
printf("\n | Serial Port Read |");
printf("\n +----------------------------------+");
uart_int();
/*------------------------------- Opening the Serial Port -------------------------------*/
fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY | O_NDELAY); /* ttyUSB0 is the FT232 based USB2SERIAL Converter */
/* O_RDWR - Read/Write access to serial port */
/* O_NOCTTY - No terminal will control the process */
/* Open in blocking mode,read will wait */
if(fd == -1) /* Error Checking */
printf("\n Error! in Opening ttyUSB0 ");
else
printf("\n ttyUSB0 Opened Successfully ");
char read_buffer[32]; /* Buffer to store the data received */
int bytes_read = 0; /* Number of bytes read by the read() system call */
int i = 0;
while(1)
{
bytes_read = read(fd, &read_buffer, 32); /* Read the data */
if(bytes_read > 0) {
printf("\n\n Bytes Rxed -%d", bytes_read); /* Print the number of bytes read */
printf("\n\n ");
for(i = 0; i < bytes_read; i++) /*printing only the received characters*/
printf("%c", read_buffer[i]);
int bytes_written = 0; /* Value for storing the number of bytes written to the port */
bytes_written = write(fd, read_buffer, bytes_read); /* use write() to send data to port*/
/* "fd" - file descriptor pointing to the opened serial port */
/* "write_buffer" - address of the buffer containing data*/
/* "sizeof(write_buffer)" - No of bytes to write */
printf("\n %d Bytes written to ttyUSB0", bytes_written);
printf("\n\n Bytes Rxed -%d", bytes_read); /* Print the number of bytes read */
printf("\n\n ");
printf("\n +----------------------------------+\n\n\n");
}
}
}