zoukankan      html  css  js  c++  java
  • 《开发板 — 调试串口》

    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修改引脚复用。这样串口就配置成功。 

  • 相关阅读:
    CATIA 各个版本代号详解
    CATIA 基础详解 第01章 CATIA初认识
    CATIA 使用技巧--转换出轻巧的tif格式文件
    中国水墨动画系列 内容简介
    Python开发 第02课 Python 数据类型
    Python开发 第01课 Python 简介
    UG 常用设置
    matplotlib 学习笔记02:marker标记详解
    matplotlib 知识点13:绘制散点图(scatter函数精讲)
    matplotlib 知识点11:绘制饼图(pie 函数精讲)
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/11958926.html
Copyright © 2011-2022 走看看