linux下,查询可用的串口的信息如下
root@NanoPi2:~# ls /proc/tty/driver/
ttyAMA usbserial
root@NanoPi2:~# cat /proc/tty/driver/ttyAMA
serinfo:1.0 driver revision:
0: uart:PL011 rev3 mmio:0xC00A1000 irq:7 tx:701 rx:38 RTS|DTR
1: uart:PL011 rev3 mmio:0xC00A0000 irq:6 tx:0 rx:0 DSR|CD
2: uart:PL011 rev3 mmio:0xC00A3000 irq:9 tx:0 rx:0
3: uart:PL011 rev3 mmio:0xC006D000 irq:10 tx:0 rx:0
fa@NanoPi2:~/Desktop$ ls /dev/ttyAMA
ttyAMA0 ttyAMA1 ttyAMA2 ttyAMA3
找到对应的ttyAMA*串口,将UARTn_TXD,UARTn_RXD用线连接起来做下回循测试(就是自发自收),
串口的操作函数主要在termios.h中,下面是读取串口并显示接收到的信息。
编译完成后执行下,在另一端口使用echo msg > /dev/ttyAMAn
向串口写信息(msg),这时执行程序会回显msg信息。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define USART_DEV "/dev/ttyAMA2"
void main(void)
{
int fd = -1;
fd = open(USART_DEV,O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd)
return;
printf("open %s success.\n",USART_DEV);
struct termios opt;
tcgetattr(fd,&opt);
opt.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
opt.c_iflag = IGNPAR;
opt.c_oflag = 0;
opt.c_lflag = 0;
opt.c_cc[VTIME] = 0;
opt.c_cc[VMIN] = 1;
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&opt);
unsigned char rx_buffer[512];
while(1)
{
memset(rx_buffer,0,sizeof(rx_buffer));
int len = read(fd,(void*)rx_buffer,sizeof(rx_buffer));
if(len > 0 && strcmp(rx_buffer,"") )
{
printf("%d bytes read:%s\n",len,rx_buffer);
}
}
close(fd);
return;
}