《開發板 — 調試串口》


1.查看串口設備

ls /dev/tty*

 

  其中ttyAMA1是我們要調試我串口。

 

2.使用ttyAMA1

通過stty -F  /dev/ttyAMA1 -a查看串口屬性

  

   可以查看波特率是9600

 

通過stty修改串口設置:

stty -F /dev/ttyAMA1 speed 115200  cs8 -parenb -cstopb

115200波特率 8數據位 1停止位 無校驗位

  

從ttyAMA1中讀取數據:

cat  /dev/ttyAMA1    //讀取串口中的數據
cat  /dev/ttyAMA1  > file.txt    //讀取到的數據保存到txt文本文件中

 

向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\n",g_fg_4g);

    tcgetattr(g_fg_4g,&opt); 
    
    DBG_PRT(DBG_OFF," A cflg=%2X oflg=%2X lflg=%2X iflg=%2X\n",
        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\n",
        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\n",
        opt.c_cflag,opt.c_oflag,opt.c_lflag,opt.c_iflag);
    DBG_PRT(DBG_OFF," FD=%d return 0\n",g_fg_4g);
    DBG_PRT(DBG_OFF,"#####\n");

    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,"\n******** print %s begin len=%d********\n",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,"\n");

	}	

	fprintf(stderr,"******** print %s end ********\n",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\n");
        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修改引腳復用。這樣串口就配置成功。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM