2019-05-21 10:01:16 qq_41877422 阅读数 290
  • 开发板、原理图和数据手册-1.3.ARM裸机第三部分

    本期课程承上启下,主要目的是让大家把开发板玩起来。很多同学买了开发板接上线,串口都连不上,或者连刷系统都不会,学习裸机时连如何下载都不会,谈何开发程序。本期课程就是为此类小白同学准备的,让大家买开发板的钱不百花。

    8102 人正在学习 去看看 朱有鹏

使用的是飞凌嵌入式开发板OKMX6UL-C为底板的嵌入式开发板,测试效果串口助手向开发板发送内容打印在终端,需要注意的是,交叉编译使用与开发板相对于的交叉编译工具,采用arm-XXX-linux-gcc.核心板为FETMX6UL-C,如图:
在这里插入图片描述
头文件及其相关定义:

#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

#define msleep(n) usleep(n*1000)   //延时1ms
/*定义全局变量*/
char first_test[200]="The first test loop\r\n";
volatile	int fd;                //volatile防止被优化
char* dev   = NULL;                //创建线程指针,串口名称串口三为:/dev/ttymxc2

pthread_mutex_t mut;               //线程锁保证所有线程对数据的修改是一致的
fd_set rd;                         //fd_set的数据结构,实际上是一long类型的数组

int nread,retval;                  //读操作和返回值
unsigned char msg[14];             //消息数组
char msg1[200];
int receiving_bit = 0;			   //消息接收标志位
struct timeval timeout={0,100};    //超时时间结构体

volatile	pthread_t thread[2];           //声明线程ID
volatile	const int READ_THREAD_ID = 0;  //读线程ID
volatile	const int SEND_THREAD_ID = 1;  //发送线程ID
volatile	int COM_READ_STATU = 1;  
volatile	int COM_SEND_STATU = 1; 
volatile	int sendnum=0,sendnum_times=0,recenum=0,recenum_times=0,cornum=0,cornum_times=0;

主函数调用相关函数:

/*定义主函数调用的函数*/
void read_port(void);              //监视端口情况读写或异常
void SignHandler(int iSignNo);     //终端信号监督
int OpenDev(char *Dev);            //打开配置相关串口驱动
static speed_t getBaudrate(int baudrate);  //波特率相关配置列表
int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU);//创建线程
void* com_read(void* pstatu);      //读取端口线程锁控制
void* com_send(void* p);           //向端口发送loop内容
//void convertUnCharToStr(char* str, unsigned char* UnChar, int ucLen);  //unsigned char数组转化为char数组

首先看主函数:

/*主函数*/
int main(int argc, char **argv)
{
	//char *dev ="/dev/ttymxc1"; 
	signal(SIGINT,SignHandler);   //信号是进程在运行过程中,由自身产生或由进程外部发过来的事件
	dev   = argv[1];              //指针的指针,指向运行时的参数一
    if(dev==NULL)
	{
     	printf("Please input serial device name ,for exmaple /dev/ttymxc2.\n");
     	exit(1);
    }
	fd = OpenDev(dev);           //打开驱动相关配置
	if (fd>0)
	{}
	else
	{
		printf("Can't Open Serial Port %s \n",dev);
		exit(0);
	}	
	printf("\nWelcome to TTYtest! Press Ctrl + 'c' to stop.\n\n");
    pthread_mutex_init(&mut,NULL);        //用默认属性初始化互斥锁
	if(start_thread_func(com_read, (pthread_t*)&thread[READ_THREAD_ID],  (int *)&COM_READ_STATU, (int *)&COM_READ_STATU) != 0)  
    {  
        printf("error to leave\n");  
        return -1;  
    }  
  
	if(start_thread_func(com_send, (pthread_t*)&thread[SEND_THREAD_ID], (int *)&COM_SEND_STATU, (int *)&COM_SEND_STATU) != 0)
    {  
        printf("error to leave\n");  
        return -1;  
    }  
  	while(1)
  	{}   //根据具体情况决定在主函数中需要处理的事件
}

监视端口情况读写或异常:

void read_port(void)        //监视端口情况读写或异常
{   
    FD_ZERO(&rd);           //将rd清零使集合中不含任何fd
    FD_SET(fd,&rd);         //将fd加入rd集合

    retval = select (fd+1,&rd,NULL,NULL,&timeout); //监视我们需要监视的内容描述符的变化情况
    switch (retval)
    {
        case 0:
            // printf("no data input within  1s.\n");
            break;
        case -1:
            perror("select");
            break;       
        default:
			if((nread=read(fd,msg,1))>0)
			{
				receiving_bit = 1;
				printf("%s",msg);
				if(recenum<65535)
				{
					recenum++;
				}
				else
				{
					recenum_times++;
					recenum=1;
				}
			}
			break;
    }
}

终端信号处理:

void SignHandler(int iSignNo)   //终端信号监督
{
	int tmp_t=0;
	
	COM_SEND_STATU = 0; 
	msleep(1000);
	COM_READ_STATU = 0;         
	msleep(1000);

	//printf("%s,stop send,sendnum=%d,receivenum=%d\n",dev,sendnum*32,recenum);
	while(tmp_t<50000)
  	{
    	read_port();
		tmp_t++;
    }
	printf("\n%s,Send: %d ,Receive: %d \n",dev,(sendnum_times*65535+sendnum)*32,(recenum_times*65535+recenum));
	exit(1);	
}

波特率处理,下面列出两中方式,本文采用第二种
方式一:

int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };  
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, };  

void set_speed (int fd, int speed)  
{  
  int i;  
  int status;  
  struct termios Opt;  
  tcgetattr (fd, &Opt);  
  for (i = 0; i < sizeof (speed_arr) / sizeof (int); i++)  
    {  
		if (speed == name_arr[i])  
		{  
			tcflush (fd, TCIOFLUSH);  
			cfsetispeed (&Opt, speed_arr[i]);  
			cfsetospeed (&Opt, speed_arr[i]);  
			status = tcsetattr (fd, TCSANOW, &Opt);  
			if (status != 0)  
			{  
				perror ("tcsetattr fd1");  
				return;  
			}  
			tcflush (fd, TCIOFLUSH);  
		}  
    }  
}  

主函数中调用:set_speed (fd, 115200); 


方式二:

static speed_t getBaudrate(int baudrate)    //波特率相关配置列表
{
	switch(baudrate) {
	case 0: return B0;
	case 50: return B50;
	case 75: return B75;
	case 110: return B110;
	case 134: return B134;
	case 150: return B150;
	case 200: return B200;
	case 300: return B300;
	case 600: return B600;
	case 1200: return B1200;
	case 1800: return B1800;
	case 2400: return B2400;
	case 4800: return B4800;
	case 9600: return B9600;
	case 19200: return B19200;
	case 38400: return B38400;
	case 57600: return B57600;
	case 115200: return B115200;
	case 230400: return B230400;
	case 460800: return B460800;
	case 500000: return B500000;
	case 576000: return B576000;
	case 921600: return B921600;
	case 1000000: return B1000000;
	case 1152000: return B1152000;
	case 1500000: return B1500000;
	case 2000000: return B2000000;
	case 2500000: return B2500000;
	case 3000000: return B3000000;
	case 3500000: return B3500000;
	case 4000000: return B4000000;
	default: return -1;
	}
}

配置相关串口参数驱动是本文重点

int OpenDev(char *Dev)            //打开配置相关串口参数驱动
{
	speed_t speed;

    int i=0;
    int fdt,c=0,num;
    struct termios oldtio,newtio;

    speed = getBaudrate(9600);   //波特率相关配置speed = B9600;
    fdt=open(Dev,O_RDWR | O_NONBLOCK| O_NOCTTY | O_NDELAY); 
	//O_RDWR:一可读可写方式打开
	//O_NONBLOCK:使I/O变成非阻塞模式,它在读取不到数据时会回传-1,并且设置errno为EAGAIN
	//O_NOCTTY:如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
	//O_NDELAY:使I/O变成非阻塞模式,它在读取不到数据时会回传0
    if(fdt<0)
    {
        perror(Dev);
        exit(1);
    }
    //save to oldtio
    tcgetattr(fdt,&oldtio);        //使用函数tcgetattr保存原串口属性 
    //clear newtio
    bzero(&newtio,sizeof(newtio)); //清空newtio中相应位
    //newtio.c_cflag = speed|CS8|CLOCAL|CREAD|CRTSCTS;
    newtio.c_cflag = speed|CS8|CLOCAL|CREAD;// 控制模式标志:波特率|8个数据位|本地连接(不改变端口所有者)|接收使能
    newtio.c_iflag = IGNPAR;       //输入模式标志:忽略奇偶校验错误
    newtio.c_oflag = 0;            //输出模式标志:Raw 模式输出
    //printf("newtio.c_cflag=%x\n",newtio.c_cflag);
    tcflush(fdt,TCIFLUSH);         //丢弃要写入引用的对象,TCIFLUSH刷新收到的数据但是不读
    tcsetattr(fdt,TCSANOW,&newtio);       //设置与终端相关的参数,TCSANOW改变立即发生
    tcgetattr(fdt,&oldtio);        //得到与 fd 指向的对象相关的参数保存于结构中,函数可以从后台进程中调用;但是,终端属性可能被后来的前台进程所改变
    //printf("oldtio.c_cflag=%x\n",oldtio.c_cflag);
    return fdt;
}

线程处理相关内容:

void* com_read(void* pstatu)      //读取端口线程锁控制
{
	int o;
	while(COM_READ_STATU)
	{
		pthread_mutex_lock(&mut);
    	read_port();
    	pthread_mutex_unlock(&mut);
	}
    pthread_exit(NULL);
}

void* com_send(void* p)           //向端口发送loop内容
{
	int a;
	int ii;
	while(COM_SEND_STATU)
	{
		if(receiving_bit != 0)
		{
			receiving_bit = 0;
			write(fd, first_test, strlen(first_test));			
			if(sendnum<65535)
			{
				sendnum++;
			}
			else
			{
				sendnum_times++;
				sendnum=1;
			}
			msleep(500);	
		}

	
/*		write(fd, first_test, strlen(first_test));		
		if(sendnum<65535)
		{
			sendnum++;
		}
		else
		{
			sendnum_times++;
			sendnum=1;
		}
		msleep(500);			
*/
	}
	pthread_exit(NULL);	
}

int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU)  //创建线程
{  
    *COM_STATU = 1;  
    memset(pthread, 0, sizeof(pthread_t));  
    int temp;  
    /*creat thread*/  
	if((temp = pthread_create(pthread, NULL, func, par)) != 0)  
	{
		printf("creat thread failer!\n");
	}  
	else  
    {  
        int id = pthread_self();  
        printf("%s,creat thread %lu sucess\n",dev, *pthread);  
    }  
    return temp;  
} 

交叉编译此.c文件,放置开发板目录下方,运行方式:

./编译时输入的名称 /dev/ttymxc2

比如(串口三):
*	arm-linux-gcc uart.c -otty_test -lpthread
*	./tty_test /dev/ttymxc2
2016-03-29 17:38:31 Chihiro_S 阅读数 1963
  • 开发板、原理图和数据手册-1.3.ARM裸机第三部分

    本期课程承上启下,主要目的是让大家把开发板玩起来。很多同学买了开发板接上线,串口都连不上,或者连刷系统都不会,学习裸机时连如何下载都不会,谈何开发程序。本期课程就是为此类小白同学准备的,让大家买开发板的钱不百花。

    8102 人正在学习 去看看 朱有鹏

嵌入式Linux开发板开发介绍:

iTOP-4412嵌入式Linux开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,独家配备三星S5M8767电源管理,配备AndroidLinux + QtUbuntu操作系统,开启学习、研发的全新方式。

 

 

嵌入式Linux开发板优势:

嵌入式Linux开发板支持SCP POP两种封装的核心板

嵌入式Linux开发板完美实现DVFS(动态电压频率调整)

全三星品质,DDR/FLASH/PMU原装三星用料

核心板的引出脚全,超强的扩展能力

八层高速PCB设计,全机器焊接,杜绝手工,批量无忧

工业级进口板对板连接器,插拔方便稳定可靠

提供SDIOWIFI模块,500万自动对焦摄像头等

嵌入式Linux开发板配套视频教程,一揽子教学方案,加速学习开发进程

 

 

嵌入式Linux开发板资料介绍:

iTOP-4412光盘资料

三星原厂资料

嵌入式Linux开发板视频教程及相关资料

1.迅为电子开发板入门视频

2.Linux系统编程

3.iTOP-4412开发板硬件设计指导视频

4.Android应用程序视频

5.Android应用教程2015

6.裸机程序实验文档以及工具文件

7.Linux-x86-qt5.3.2以及qte4.7.1应用视频

8.Linux驱动教程

9.迅为电子java视频教程

 

iTOP-4412开发板系统源码及镜像

所需PC软件

搭建编译环境所需要的工具包以及补丁包

嵌入式学习推荐书籍及软件

 

开发板参数:

 

 

核心板参数

尺寸

50mm*60mm

高度

连同连接器在内0.26cm

CPU

Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz

内存

1GB 双通道 DDR3(2GB 可选)

存储

4GB EMMC(16GB 可选)

电源管理

低功耗动态三星S5M8767电源管理,最优架构!

工作电压

2.65V--5.5V (推荐4.0V)

系统支持

Linux-QT/Android4.2/Ubuntu操作系统

USB HOST

板载USB3503,引出高性能HSIC,实现2路USB HOST输出

引角扩展

引出脚多达320个,满足用户各类扩展需求

运行温度

-25度至+80度区间,设备工作正常,运行良好!

底板参数

尺寸

110mm*190mm

SWITCH

电源接口

RESET

1个复位按键

POWER

电直流电源输入接口,5V/2A电源输入

TF Card

1个标准TF卡接口

USB Host

2路USB Host,支持USB2.0协议

USB OTG

1路USB OTG 2.0

以太网口

10M/100M自适应网口

PHONE

支持耳机输出

MIC

支持MIC输入

串口

2路串口

A/D

1路

User Key

5个功能按键

DIP SWITCH

1个

GPIO

20PIN(电源和地)

CAMERA接口

1个(可支持200万和500万摄像头)

WIFI接口

1个

HDMI接口

标准HDMI v1.4,1080p高清分辨率输出

LCD接口

共3个,2个LVDS接口,1个RGB接口

LCD电源开关

1个

MIPI接口

1个

实时时钟

内部实时时钟,带有后备锂电池座,断电后系统时间不丢失

BUZZER

1个蜂鸣器

JTAG接口

1个

串口、矩阵键盘、GPS接口

1个

 

 

软件资源:

 

最新的Android 4.0.3 /Android 4.4

Bootloader

u-boot.bin

版本:u-boot-1.3.4

支持Nand Flash擦除、读、写

支持bootm、bootargs设置

支持打印、设置、保存环境变量

支持内存内容显示、对比、修改

支持USB 下载镜像等功能(提供源码)

内核及设备驱动程序

内核:内核版本

linux3.0.15与linux 3.5两种

 

系统时钟

系统主频:1.5GHz

 

内存

1GB  或 2GB

 

显示驱动

支持4.3寸、7寸、9.7寸等

提供源码

TOUCH

触摸屏驱动

提供源码

HDMI

HDMI v1.4

提供源码

MFC

多媒体硬件编解码驱动

提供源码

ROTATOR

屏幕旋转驱动

提供源码

TF卡接口

1个TF卡接口

提供源码

HSMMC

SD/MMC/SDIO驱动

提供源码

SPI

SPI驱动

提供源码

KEYBD

按键驱动程序

提供源码

AUDIO

音频驱动

提供源码

DMA

DMA驱动

提供源码

RTC

实时时钟驱动

提供源码

JPEG

JPEG硬件编解码驱动

提供源码

2D

2D硬件加速驱动

提供源码

3D

3D硬件加速驱动

提供源码

I2C TP驱动

I2C 电容屏触摸驱动

提供源码

PWM背光驱动

PWM背光驱动

提供源码

USB驱动

USB驱动

提供源码

串口驱动

串口驱动

提供源码

网口驱动

网卡驱动

提供源码

WIFI驱动

WIFI驱动

提供模块

Camera驱动

200万像素摄像头驱动

提供源码

蓝牙驱动

蓝牙模块驱动

提供模块

3G驱动

3G上网卡驱动

提供源码

GPS模块

支持 GNS7560 全球定位

提供源码

交叉编译器

arm-2009q3.tar.bz2

交叉工具链

上层应用程序

Clock

这是Android 下一个闹钟程序,可以设置闹铃时间、铃声选择等

Calculator

计算器

Camera

摄像头应用程序

Phone

Android下的电话拨号软件,有呼叫记录、联系人等功能

Email

收发Email工具

Settings

Android下的各种应用和服务的设置等功能

Browser

Android 下的Brower 功能非常强大,支持网页放大、缩小、跳转、属性设置等

音频播放器

支持专辑分类,艺术家、专辑、歌曲、播放列表、派对随机播放、背景播放、搜索等功能

Messaging

Android下的短信软件

Gallery

图片浏览控件,支持图片放大、缩小、上一张、下一张、幻灯片演示、共享、旋转、裁切、图片信息等

PC端烧写工具

DNW V0.60C

串口调试终端、USB下载镜像工具

Ubuntu12.04

Ubuntu12.04

开发环境

最稳定、最通用的Linux + Qt操作系统

Bootloader

u-boot.bin

版本:u-boot-1.3.4

支持Nand Flash擦除、读、写

支持bootm、bootargs设置

支持打印、设置、保存环境变量

支持内存内容显示、对比、修改

支持USB 下载镜像等功能(提供源码)

内核及设备驱动程序

内核:内核版本

linux3.0.15与linux 3.5两种

 

系统时钟

系统主频:1.5GHz

 

内存

1GB  或 2GB

 

显示驱动

9.7寸(分辨率1024×768)驱动

提供源码

TOUCH

触摸屏驱动

提供源码

HDMI

HDMI v1.4

提供源码

MFC

多媒体硬件编解码驱动

提供源码

ROTATOR

屏幕旋转驱动

提供源码

TF卡接口

1个TF卡接口

提供源码

HSMMC

SD/MMC/SDIO驱动

提供源码

SPI

SPI驱动

提供源码

KEYBD

按键驱动程序

提供源码

AUDIO

音频驱动

提供源码

DMA

DMA驱动

提供源码

RTC

实时时钟驱动

提供源码

JPEG

JPEG硬件编解码驱动

提供源码

2D

2D硬件加速驱动

提供源码

3D

3D硬件加速驱动

提供源码

I2C TP驱动

I2C 电容屏触摸驱动

提供源码

PWM背光驱动

PWM背光驱动

提供源码

USB驱动

USB驱动

提供源码

串口驱动

串口驱动

提供源码

网口驱动

网卡驱动

提供源码

WIFI驱动

WIFI驱动

提供模块

Camera驱动

200万像素摄像头驱动

提供源码

蓝牙驱动

蓝牙模块驱动

提供模块

3G驱动

3G上网卡驱动

提供源码

GPS模块

支持 GNS7560 全球定位

提供源码

交叉编译器

arm-2009q3.tar.bz2

交叉工具链

PC端烧写工具

DNW V0.60C

串口调试终端、USB下载镜像工具

Ubuntu12.04

Ubuntu12.04

开发环境


 

 

2017-12-03 17:34:46 zhangfen137 阅读数 402
  • 开发板、原理图和数据手册-1.3.ARM裸机第三部分

    本期课程承上启下,主要目的是让大家把开发板玩起来。很多同学买了开发板接上线,串口都连不上,或者连刷系统都不会,学习裸机时连如何下载都不会,谈何开发程序。本期课程就是为此类小白同学准备的,让大家买开发板的钱不百花。

    8102 人正在学习 去看看 朱有鹏

硬件准备:

1usb线,一个 tf 卡,udoo neo 板子。

软件准备:

下载官方系统镜像文件:https://www.udoo.org/downloads/

提示:下载时候很慢,多试几次,耐心等下载完。


本文使用的:UDOObuntu 2.1.4 Minimal (14.04 LTS),下载后,解压出img文件

Win 电脑需要:下载安装Win32DiskImager软件,putty软件

制作启动卡,开机:

使用 Win32DiskImager img 文件写入 tf 卡中。

完成后,tf卡插入 udoo neo板子,usb线连上电脑,板子自启动开机。

电脑设备管理器多两个设备,一个是大容量存储,一个是感叹号设备/未知设备或者是个RNDIS设备,usb ssh 登录需要用RNDIS,需要安装设备驱动。


安装驱动:更新驱动=>浏览我的计算机以查找驱动程序软件=>从我的计算机上的可用驱动程序列表中选取=>厂商:microsoft,型号:远程NDIS兼容设备(或者usb RNDIS适配器/ usb RNDIS6适配器,测试过的,这三个驱动都可以用)


安装后电脑设别管理器=>网络适配器下就出现远程NDIS兼容设备。开发板重启一下。


Putty 登录:

ssh 登录192.168.7.2

用户名/密码:udooer/udooerroot/ubuntu

到此官方镜像系统可以正常的使用了:



2017-02-21 13:49:26 readnap 阅读数 3209
  • 开发板、原理图和数据手册-1.3.ARM裸机第三部分

    本期课程承上启下,主要目的是让大家把开发板玩起来。很多同学买了开发板接上线,串口都连不上,或者连刷系统都不会,学习裸机时连如何下载都不会,谈何开发程序。本期课程就是为此类小白同学准备的,让大家买开发板的钱不百花。

    8102 人正在学习 去看看 朱有鹏

我想如果要从PC机下载东西到开发板的嵌入式linux系统里面,很多人首先会想到用tftp sftp等网络工具从网口下载。但如果网络用不了,只能通过串口下载怎么办呢?这个时候有两个工具能帮到你:一个是zmrx、zmtx,另外一个是lsz、lrz。个人觉得zmrx/zmtx没有lsz/lrz稳定,建议还是用后者。下面介绍一下lsz/lrz的使用方法。

    

一、编译lrzsz并下载到开发板上

从http://download.chinaunix.net/download/0007000/6293.shtml下一个lrzsz的tar包lrzsz-0.12.20.tar.gz,解压缩后执行./configure(如果已在环境变量中导入toolchain,则configure后会自动配好makefile;否则手动修改),然后make,编译完成后,进入src文件夹中得到两个可执行文件lsz,lrz,把它们下载到开发板linux根文件系统的/bin目录下。

   

二、情况1: PC机用windows操作系统

如果PC机用的是windows操作系统,串口通信工具可以用系统自带的超级终端。下面介绍一下传输文件的方法。

1、开发板-->PC机

在开发板上输入 lsz filename。

在PC机上点击超级终端的菜单“传送”-> “接收文件”,选择下载的位置和Zmodem 与崩溃恢复协议,点击接收即可。

2、PC机-->开发板

在开发板上输入 lrz。

在PC机上点击超级终端的菜单“传送”-> “发送文件”,选择目标文件和Zmodem 与崩溃恢复协议,点击发送即可。

注:以上生成的lsz、lrz文件可以直接烧写到开发板根文件系统/bin目录下,对于超级终端或者最常用的SecureCRT都可以使用,通过输入命令lrz就可以从pc机传文件到开发板。

2015-07-20 16:35:59 FIRSTSTARS 阅读数 1800
  • 开发板、原理图和数据手册-1.3.ARM裸机第三部分

    本期课程承上启下,主要目的是让大家把开发板玩起来。很多同学买了开发板接上线,串口都连不上,或者连刷系统都不会,学习裸机时连如何下载都不会,谈何开发程序。本期课程就是为此类小白同学准备的,让大家买开发板的钱不百花。

    8102 人正在学习 去看看 朱有鹏

最近整了块Cortex-M3的开发板,按板子的资料编了个uclinux内核写入flash运行,出现如下的乱码。


~ # whoami
root
~ # ls
bin    dev    etc    httpd  init   mnt    proc   root   sys    usr    var
~ # 


该显示的东西也都有,看着是多了些前缀和后缀字符。

在Linux下用minicom显示正常。再换其他的串口工具试了一下发现,支持串口着色的都能正常显示,否则就出现如上情况。

搜索了一下发现果然有人遇到同样的问题,就是串口着色闹的鬼。

不显示颜色就好了。

~ # ls --color=never
bin    dev    etc    httpd  init   mnt    proc   root   sys    usr    var


要彻底解决就在编译busybox的时候把shell着色去掉。

没有更多推荐了,返回首页