1.查看串口设备
ls /dev/tty*
其中ttyAMA1是我们要调试我串口。
2.使用ttyAMA1
通过stty -F /dev/ttyAMA1 -a查看串口属性
可以查看波特率是9600
通过stty修改串口设置:
stty -F /dev/ttyAMA1 ispeed 115200 ospeed 115200 cs8 115200波特率 8数据位 1停止位 无校验位
从ttyAMA1中读取数据:
cat /dev/ttyAMA1 //读取串口中的数据 cat /dev/ttyAMA1 > file.txt //读取到的数据保存到txt文本文件中 或者 microcom -t 10000 -s 115200 /dev/ttyAMA1 # microcom 读数据,10秒无数据,退出 microcom
向ttyAMA1中写数据:
echo "1" > /dev/ttyAMA1
3.串口配置
场景:在调试串口为ttyFIQ0的时候,要调试485。485连接在uart0上。在设备树中使能了设备树后,发现只能往外发送数据,但是用cat数据接收不进来。(用示波器测试485芯片上的Rx有数据进来的情况下)
可能原因:波特率不同,因为ttyFIQ0是115200,但是uart0的波特率是9600。但是数据可以发送出去用echo,并且在电脑端接收没有乱码。不太理解为什么?
解决:写串口程序。
/******************************************************* *filename:serial_rev.c *Description:receivedata from Serial_Port *Date: *******************************************************/ #include <stdio.h> #include <string.h> #include <malloc.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/msg.h> #include <termios.h> #include <sys/time.h> #include <stdlib.h> #include <unistd.h> #include <termios.h> #include <sys/ioctl.h> #include "uart_4g_ttyusb2.h" //#include <pthread.h> /*********************************************************/ #define CMD_LEN 7 //#define MAX_MSG_BUFF_SIZE 128 /*定义缓冲区最大宽度*/ static int g_fg_4g = -1; static char frame_tail[] = {0xFF,0xFC,0xFF,0xFF}; //#define TTYS_DEVNAME "/dev/ttyAMA1" /*需要把寄存器配置uart2的复用口为uart*/ //#define TTYS_DEVNAME "/dev/ttyAMA2" /*需要把寄存器配置uart2的复用口为uart*/ //#define TTYS_DEVNAME "/dev/ttyS1" //#define TTYS_DEVNAME "/dev/ttyUSB0" #define TTYS_USB2_DEVNAME "/dev/ttyAMA1" int uart_4gserial_dev_init() { struct termios opt; if(0 < g_fg_4g) { printf("%s is already opened!",TTYS_USB2_DEVNAME); } if(0 > g_fg_4g) { g_fg_4g = open(TTYS_USB2_DEVNAME, O_RDWR|O_NOCTTY); /*读写方式打开串口*/ } if(0 > g_fg_4g) /*打开失败*/ { printf("open %s Error",TTYS_USB2_DEVNAME); return -1; } DBG_PRT(DBG_OFF," FD=%d ",g_fg_4g); tcgetattr(g_fg_4g,&opt); DBG_PRT(DBG_OFF," A cflg=%2X oflg=%2X lflg=%2X iflg=%2X ", opt.c_cflag,opt.c_oflag,opt.c_lflag,opt.c_iflag); cfmakeraw(&opt); DBG_PRT(DBG_OFF," B cflg=%2X oflg=%2X lflg=%2X iflg=%2X ", opt.c_cflag,opt.c_oflag,opt.c_lflag,opt.c_iflag); cfsetispeed(&opt,B9600); /*波特率设置为B115200bps*/ cfsetospeed(&opt,B9600); //cfsetispeed(&opt,B115200); /*波特率设置为B115200bps*/ //cfsetospeed(&opt,B115200); opt.c_iflag = 0; opt.c_oflag = 0; opt.c_lflag = 0; //non ICANON opt.c_cflag &= ~PARENB; opt.c_cflag |= CSTOPB;//停止位2位 opt.c_cflag &= ~CSIZE; opt.c_cflag |= CS8; fcntl(g_fg_4g,F_SETFL,0); opt.c_cc[VTIME] = 2; opt.c_cc[VMIN] = 128; tcsetattr(g_fg_4g,TCSANOW,&opt); tcflush(g_fg_4g, TCIFLUSH); tcgetattr(g_fg_4g,&opt); DBG_PRT(DBG_OFF," C cflg=%2X oflg=%2X lflg=%2X iflg=%2X ", opt.c_cflag,opt.c_oflag,opt.c_lflag,opt.c_iflag); DBG_PRT(DBG_OFF," FD=%d return 0 ",g_fg_4g); DBG_PRT(DBG_OFF,"##### "); return 0; } int uart_4gserial_dev_close() { int ret = 0; ret = close(g_fg_4g); if(ret == -1) DBG_PRT(DBG_OFF,"Closethe Device failur"); return 0; } #define PRI_LEN 8 void buf_print(char* str,unsigned char *buf, int len) { int i = 0; int j = 0; if(NULL == buf) { return; } fprintf(stderr," ******** print %s begin len=%d******** ",str,len); while (i < len) { if ((len - i) < PRI_LEN ) { for (; i < len; i++) { fprintf(stderr,"0x%02X ",buf[i]); } } else { for (j = 0; j < PRI_LEN; j++) { fprintf(stderr,"0x%02X ", buf[i + j]); } i += 8; } fprintf(stderr," "); } fprintf(stderr,"******** print %s end ******** ",str); return; } int uart_4guart_cmd_send(unsigned char *cmd, int len) { int write_len = -1; if(len > SERIAL_OUT_BUFF_SIZE - 1 || 0 > g_fg_4g) { return -1; } //buf_print("uart_cmd_send buf",cmd,len); write_len = write(g_fg_4g, cmd, len); //write_len = len; if(write_len != len) { DBG_PRT(DBG_OFF,"write Device failureá"); return -1; } return 0; } int uart_4guart_at_read(unsigned char *tmpbuff, int len) { int ret,rcv_len,n = 0; rcv_len = read(g_fg_4g, tmpbuff, len); if(rcv_len == -1) { DBG_PRT(DBG_ON," read err "); perror("read"); return -1; } return rcv_len; }
4.从内核配置串口
问题描述:一开始通过ls查看到有ttyAMA1这个设备节点。但是直接使用的时候不能使用。然后使用stty查看属性。提示:没有这个设备或者地址。
问题分析:有可能是串口驱动里面直接映射了这个设备节点,也就是创建了这个设备节点。但是并没有配置硬件。
问题修改:
1.使能uart1
vi arch/arm/boot/dts/hi3521d.dtsi
可以查看到这个设备。直接将status中修改成okay。就可以了(不过不建议直接在这边修改)
直接修改
vi arch/arm/boot/dts/hi3521d.dts
本来只有一个uart0,这个是我们的调试串口。
然后模仿写一个uart1。
2.引脚复用
查看海思的引脚复用手册可以看到
通过himm修改引脚复用。这样串口就配置成功。