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

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/11958926.html
Copyright © 2011-2022 走看看