arm linux 传输文件

2015-08-05 13:46:54 u011127242 阅读数 2903

arm-linux笔记3:arm-linux PC文件传输方法总结(4种最常见的方法)

 

1使用串口终端传输文件
2使用ftp传输文件
3使用nfs传输文件
4使用u盘拷贝

 

串口的优点是方法简单,不需要过多的配置,不需要联接网络,但是发送数据的速度比较慢,不适用于传输超过10M的文件

ftp的配置的时候需要联网,还需要下载ftp服务以及进行复杂的配置,大小文件传输速度都比较快,但是好像只能传输单个文件,没有nfs方便

 

nfs配置的时候也需要联网,还需要下载nfs服务以及进行复杂的配置,配置好了之后,对文件的操作就是本地复制了,大小单双文件随意复制,当然最为方便啦

 

u盘传文件当然也方便,但是容易出问题,因此还是用靠谱一点的方法吧

 

综上:没有网的时候优先选择串口传输,有网的时候小文件就直接用串口,可以避免配置ftp和nfs服务;传输的文件较大的时候就直接用nfs或者ftp,若需要发送文件夹有不想压缩文件就直接用nfs了


一串口传输文件(SecureCRT软件)
1 cross fall to download securecrt(ubuntu)  //下载linux下的软件
2install securecrt (deb) //安装软件
 dpkg -i xxxx.deb
3install ssh  //安装ssh服务,串口控制arm linux的服务
 apt-get install openssh-server
 ps -e|grep ssh  to check if it's open,if open you'll see a sshd
 if not open, /etc/init.d/ssh start,then it'll open
4 crack securecrt  //下载破解文件securecrt_linux_crack.pl
 http://www.cnblogs.com/wangkongming/p/3533240.html
  
  wget http://download.boll.me/securecrt_linux_crack.pl
  sudo perl securecrt_linux_crack.pl  /usr/bin/SecureCRT //安装破解文件,最好将该文件放在和deb安装包相同的目录下面
  then it will show crack successful  and show Licence;
  inpute Licence to software,next time you login,no 30 days warning
注意:从Licence开始复制
已经有.pl文件就不需要wget下载了
5check if your computer has  usbserial(default it has a usbserial)
     lsmod | grep usbserial
     ->usbserial              38972  1 pl2303
 
 check if computer can recogonize usb
     dmesg | grep ttyUSB0
     ->usb 2-1.1.3: pl2303 converter now attached to ttyUSB0
6 open secureCRT  //用secureCRT的时候最好要把对应的dev/ttyUSB0串口提一下权限,不然容易出错
  open a quick connect 
  sudo chmod 777 /dev/ttyUSB0->Permission denied 

7 transfer file to armBoard
2、Secure 传输文件
cd 到保存文件的目录
输入rz 然后enter就会选择文件了      


1、开发板-->PC机
           在开发板上输入 sz filename。
           在PC机上点击超级终端的菜单“传送”-> “接收文件”,选择下载的位置和Zmodem 与崩溃恢复协议,点击接收即可。
2、PC机-->开发板
           在开发板上先进入/tmp 目录,然后输入 rz。
           在PC机上点击超级终端的菜单“传送”-> “发送文件”,选择目标文件和Zmodem 与崩溃恢复协议,点击发送即可。


注意:linux下的SecureCRT软件不好下载,下载的时候可能需要翻墙,而且破解文件还要对应相应版本,否则无法下载了也无法使用!使用破解文件账号信息的时候可能一次弄不好,因此要有耐心多复制几次!
这里提供我平时用的一个版本的链接,供大家使用!
http://yunpan.cn/cdQNpsTiXI5Sf (提取码:b4c7)


当然,串口传输还可以使用minicom工具,minicom的安装和配置简要说明如下
apt-get install minicom
设置:ctrl + A 之后按Z--> 按 o--> Serial port setup-->A set device :/dev/ttyUSB0-->F No G No--> save ...dfl
确认和选择按enter键
minicom实际上也可传输文件的,但是好像不怎么方便,有兴趣的可以自己去百度一下!

 

 

 

 

二ftp传输文件
1、install ftp

 

 apt-get install ftp

 

 

new a acount:
sudo useradd -m ftp //创建一个ftp专用的用户,当然也可以不创建了,对pc上的一个文件提权就行了
sudo passwd ftp
enter:111111
new a ftp acount named ftp,passwd is 111111
sudo chmod 777 /home/ftp  

2、modify (6410)ip
vi  /etc/eth0-setting
modify  ip to your computer ip range
use ipconfig get ip 
original ip is 192.168.1.230
new ip is 192.168.1.109
get(/hoime/plg) write privelige
chmod 777 /home/plg
you need to restart arm6410 to get the ip

3 use ftp in ubuntu terminal 
xg@xg:~$ ftp 192.168.1.109
Connected to 192.168.1.109.
220 FriendlyARM FTP server (Version 6.4/OpenBSD/Linux-ftpd-0.17) ready.
Name (192.168.1.109:xg): plg
331 Password required for plg.
Password:
230 User plg logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /home/ftp
Local directory now /home/ftp
ftp> cd /home/plg
250 CWD command successful.
ftp> pwd
257 "/home/plg" is current directory.
ftp> put console
local: console remote: console
200 PORT command successful.
150 Opening BINARY mode data connection for 'console'.
226 Transfer complete.
121271 bytes sent in 0.05 secs (2.4505 MB/s)
ftp> get console
local: console remote: console
200 PORT command successful.
150 Opening BINARY mode data connection for 'console' (121271 bytes).
226 Transfer complete.
121271 bytes received in 0.16 secs (748.6769 kB/s)
ftp> bye
221 Goodbye.
xg@xg:~$ 

problems //常见问题
every times you use,you should 
chmod 777 /home/user,or you will meet permission denied

三 nfs传输文件
A PC上nfs配置
1安装nfs
sudo apt-get install nfs-kernel-server
重启nfs
sudo service nfs-kernel-server restart  
或者
sudo /etc/init.d/nfs-kernel-server restart
2指定PC机nfs的目录
修改/etc/exports 这个文件。在这个文件的最后一行添加如下代码
/home/xg/Desktop *(rw,sync,no_root_squash)
注意:*号前边有个空格,*号后没有空格,并且,逗号前后没有空格。

B 开发板客户端
要想连接上 PC虚拟机 Ubuntu上的/home/xg/Desktop,
1. 首先【必须】保证你的开发板可以 ping 通 PC 虚拟机 Ubuntu,ping ip地址即可
2. 能 ping 通虚拟机 Ubuntu 之后,在开发板上使用 mount 命令来挂载。怎么挂载?
mount -t nfs -o nolock 192.168.1.101:/home/xg/Desktop /mnt
说明:
a) mount 是挂载命令
b) –t nfs 是 使用 nfs 协议来挂载
c) intr,nolock,rsize=1024,wsize=1024,这几个参数不做过多解释,为了就是保证传
输文件不出错,具体含义,可以百度
d) 192.168.1.100,这个是 PC 虚拟机 Ubuntu 下的 IP 地址,根据自己的情况自行修
改,我的是 192.168.1.101
e) /home/xg/Desktop,这个就是我们前边说的要挂载的绝对路径的目录
f) /mnt 就是开发板上的 mnt 文件夹
如果一切正常,开发板的 mnt 目录下就可以看到 PC 虚拟机 Ubuntu, /home/xg/Desktop这个目录下的内容,也就可以实现文件的互传。

开发板modify (6410)ip
vi  /etc/eth0-setting
modify  ip to your computer ip range
use ipconfig get ip 
original ip is 192.168.1.230  //自己设置一个同一局域网下的ip即可
new ip is 192.168.1.109
get(/hoime/plg) write privelige
chmod 777 /home/plg
you need to restart arm6410 to get the ip
pc mount命令,可以现在pc下挂载一下nfs看看nfs是否正常
mount -t ntfs /dev/sda5 /mnt/d     mount sda5 to /mnt/d windows mount 
若正常则可以挂载到对应的开发板中,嵌入式开发板还要加 nolock命令
mount –t nfs intr,nolock,rsize=1024,wsize=1024 192.168.1.101:/home/xg/Desktop
 /mnt
挂载成功就可以随意复制文件了!


四 u盘拷贝文件
对于不想使用各种配置的就可以使用u盘,u盘方便可是容易出问题啊,因此不建议使用!
有时候u盘格式出问题了就复制不了,还有一些非正规的u盘也会出现无法拷贝的情况,一次强烈建议使用以上方法进行传输文件!
 


至此,arm-linux下的文件传输就总结完成了,发现问题的请予以指正,以便沟通学习!!

 

 

2010-02-09 19:13:00 feiyinzilgd 阅读数 10183

嵌入式arm linux蓝牙文件传输移植
目前,蓝牙技术已经比较成熟,特别是基于手机和PC得蓝牙文件传输。
本文主要讲述基于嵌入式arm linux的蓝牙文件传输。
 
   现行2.6.x的linux内核都已经集成了bluez蓝牙驱动,对于2.4版本内核的需要到bluez官方网站下载并安装bluez蓝牙驱动。
http://www.bluez.org/download/
   本为基于2.6版本的内核讲述。对于2.4下载bluez后安装即可。有了bluez蓝牙驱动还需要安装bluez-libs库和bluez-utils工具
   蓝牙文件传输应用开发分为2部分,On  pc  和on ARM。
   我用linux系统配置
   fedora 9
   内核版本 2.6.25
   gcc:4.0.0
做嵌入式开发用新版本的内核总是会遇到很多问题。2.6.11的内核比较适合做嵌入式开发。
 
   首先:在pc上安装bluez-libs库和bluez-utils工具。
   1,在bluez官方网站下载bluez-libs和bluez-utils
http://www.bluez.org/download/
我下载的是bluez-libs-3.36和bluez-utils-3.36。

2.编译PC的linux内核

3.安装libs和utils。
libs和bluez得安装都是安装linux软件正常方式安装
   安装libs

注意:如果你是fedora 9或者是内核是2.6.25及以上的版本在安装utils的时候会出现某些文件没有或者是参数没定义的问题。
   第二,移植libs库和utils工具到arm开发板
我的开发板配置:
linux内核:2.6.29(主要是我的开发板自带内核带了很多工具,如果换底版本的内核的话,会比较麻烦,所以就是用了其自带核)
arm-linux-gcc:4.3.2
我把所有的压缩包都放在了/opt/arm/下,我下面讲述的都是针对这个目录下。大家可以针对自己的喜好来选择目录   
   1,安装交叉编译工具arm-linux-gcc

2,解压编译配置内核
    由于我使我开发板光盘自带的内核源码,所以不需要修改源码中的Makefile。如果是从网上下载的内核源码,在编译的时候需要修改Makefile。需要对

配置内核的时候,需要把蓝牙的部分配置加上去。
然后就开始交叉编译内核。

 

3.移植bluez-libs.
创建一个文件夹用来安装libs,然后交叉编译,并安装,流程如下:
我是把所有的都安装包都放在/opt/arm下,可根据自己的情况自己选择。
交叉编译的libs库和utils分别安装在/opt/arm/libs和/opt/arm/utils

 

然后就:wq保存。
在命令行输入

交叉编译utils工具。

由于蓝牙配对时有一个passcode或者是pin.当蓝牙设备A向蓝牙设备B发出连接请求时,A会想B发出一个配对密码,只有当B向A发送相同的 配对密码后才会建立连接。这个发送配对密码是通过/utils/etc/bluetooth/hcid.conf的配置来完成的

到此,libs和utils工具都已经交叉结束。需要一直的libs库和utils工具都在/opt/arm/libs和/opg/arm/utils下了。
接下来要做的就是重做文件系统
将开发板光盘自带的文件系统压缩包复制到/opt/arm下

 

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/02/09/5303149.aspx
并请联系谭海燕本人或者前往谭海燕个人主页留言

2012-09-11 20:52:18 alada007 阅读数 1299

嵌入式linux系统与主机通过串口传输文件
     我想如果要从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包,解压缩后输入./configure,然后进入了src文件夹中,修改了src文件夹中的Makefile文件,配置为与手机对应的交叉编译器,运行make,ok!得到两个可执行文件sz,rz(或者 lsz,lrz),把它们下载到开发板linux系统的/bin目录下。 
     二、情况1: PC机用windows操作系统
     如果PC机用的是windows操作系统,串口通信工具可以用系统自带的超级终端。下面介绍一下传输文件的方法。
      1、开发板-->PC机
        在开发板上输入 sz filename。
        在PC机上点击超级终端的菜单“传送”-> “接收文件”,选择下载的位置和Zmodem 与崩溃恢复协议,点击接收即可。
      2、PC机-->开发板
         在开发板上先进入/tmp 目录,然后输入 rz。
         在PC机上点击超级终端的菜单“传送”-> “发送文件”,选择目标文件和Zmodem 与崩溃恢复协议,点击发送即可。

2020-03-23 00:43:17 lhl51311 阅读数 38

启动内核后用U盘进行驱动文件和应用文件的传输

在JZ2440开发板启动内核后,想要传输驱动程序文件。除了常用的NFS方式外,还有一种方式:让开发板上的ARM-LINUX系统直接挂载U盘,通过U盘传输文件(推荐格式化U盘为FAT格式,其他文件系统格式没有尝试过),插入U盘后,终端会有输出提示:
终端输出提示
我的开发板是sdc,通过命令查看(要根据自己开发板的实际情况):
#ls /dev/sdc*
我的开发板运行结果如下:
运行结果提示

在mnt目录下建立一个用于挂接的目录:
#mkdir /mnt/udisk

挂载U盘到/mnt/udisk :
#mount -t vfat /dev/sdc1 /mnt/udisk

现在可以通过ls命令查看U盘中文件了:
#ls /mnt/udisk

再次使用U盘到PC机拷贝文件的时候,记得要先取消挂载:
#umount /mnt/udisk

2014-09-25 19:59:58 yezhen910328 阅读数 1835

关于上位机以及arm的串口编程,网上的资料很多,不过两者代码同时给出的资料却很少,本菜鸟经过几天时间的煎熬,终于实现了用自己编写的上位机软件传输文件到arm板上。上位机使用的是C#,arm上使用的是Linux C,使用的文件传输协议为XModem。关于XModem协议的格式可以参考我前面转的一篇博客,这里就不细说了。

下面首先贴出代码:

/******ARM上的应用程序******/

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

unsigned char buf[132];
int debug_buf[132];
int i;

//打印出接收到的数据(调试时用)
void print_data_package()
{
	printf("received package:\n");
	for(i=0;i<132;i++)
	{
		debug_buf[i]=buf[i];
		printf("%d ",buf[i]);
	}
	printf("\n");
	printf("\n");
}

//初始化串口
void uart_init()
{
	struct termios tmp_term;
	int fd;

	if( (fd = open("/dev/ttyS1", O_RDWR)) < 0 ) {
		printf("Error: cannot open file /dev/ttyS1");
		exit(1); 
	}	

	if(isatty(fd) == 0) { 
		printf("Error: /dev/ttyS1 is not a tty\n");
		close(fd);
		exit(1); 
	}	
      	 
	if(tcgetattr(fd, &tmp_term) < 0) {
		printf("Error: get termios failed\n");
		close(fd);
		exit(1); 
	}	
    
	tmp_term.c_cflag = CS8|CREAD|HUPCL|CLOCAL;   
	tmp_term.c_oflag = 0;
	tmp_term.c_iflag = IXANY|IGNBRK|IGNPAR;
	tmp_term.c_lflag = 0;
	tmp_term.c_cc[VMIN]=132;  //read函数最少读到132字节数据才返回,否则保持阻塞,以此保证数据包的完整性
	tmp_term.c_cc[VTIME]=0;


	cfsetispeed(&tmp_term,B115200); //设置波特率
	cfsetospeed(&tmp_term,B115200);
  
	if(tcsetattr(fd, TCSAFLUSH, &tmp_term) < 0) {
		printf("Error: set termions failed\n");
		close(fd);
		exit(1); 
      	}
	close(fd);
}


int main(int argc, char** argv)
{
	unsigned char signal[1];
	unsigned char check_sum=0; //校验和
	unsigned char package_number=0; //包号
	char file_name[100]; //文件名
	int dev_fd;
	int file_fd;	

	uart_init(); //初始化串口
	sprintf(file_name,"/mnt/usb/arm_program/received_data");

	memset(buf,0,sizeof(buf));
	dev_fd=open(argv[1],O_RDWR|O_NOCTTY); //打开串口
	tcflush(dev_fd,TCIOFLUSH); //清空串口缓冲区
	printf("%s opened\n",argv[1]);
	printf("\n");
	if(dev_fd==-1)
	{
		perror(argv[1]);
		exit(1);
	}

	read(dev_fd,buf,132); //接收第一个数据包
	if(buf[0]==0x01) //接收到第一个SOH信号
	{
		printf("first SOH received\n");
		printf("\n");
		signal[0]=0x15;		
		write(dev_fd,signal,1);  //发送NAK信号
		printf("NAK sent\n");
		file_fd=open(file_name,O_RDWR|O_CREAT); //打开文件,此文件用来保存接收到的数据

		read(dev_fd,buf,132); //读取数据包		
		tcflush(dev_fd,TCIFLUSH); //清空串口接收缓冲区
		print_data_package();
		while(buf[0]!=0x04) //未收到EOT信号
		{		
			if(buf[0]==0x01&&buf[1]==package_number) //包头及包号正确
			{			
				printf("data package structure and package number right\n");	
				printf("my package head: %d, my package number: %d, your package  number:%d\n",buf[0],package_number,buf[1]);
				printf("\n");
				check_sum=0; 			
				for(i=3;i<131;i++)
				{
					check_sum+=buf[i]; //计算校验和			
				}
				if(check_sum==buf[131]) //校验和正确	
				{
					printf("check summation right\n");	
					printf("my check summation: %d, your check summation: %d\n",check_sum,buf[131]);	
					printf("\n");				
					lseek(file_fd,0,SEEK_END); //移至文件尾部
					write(file_fd,buf+3,128); //将数据写入文件					
					signal[0]=0x06; 
					write(dev_fd,signal,1); //发送ACK信号
					printf("ACK sent\n");
					package_number++; //包号加1
					memset(buf,0,132); //清空数据包				
					read(dev_fd,buf,132); //读取数据包	
					tcflush(dev_fd,TCIFLUSH); //清空串口接收缓冲区
					print_data_package();
				}	
				else
				{
					printf("check summation wrong\n");	
					printf("my check summation: %d, your check summation: %d\n",check_sum,buf[131]);	
					printf("\n");
					signal[0]=0x15;
					write(dev_fd,signal,1); //发送NAK信号
					printf("NAK sent\n");
					memset(buf,0,132); //清空数据包			
					read(dev_fd,buf,132);  //读取数据包					
					tcflush(dev_fd,TCIFLUSH);  //清空串口接收缓冲区
					print_data_package();
				}
			}
			else
			{
				printf("data package sturcture or number wrong\n");
				printf("my package head: %d, my package number: %d, your package number: %d\n",buf[0],package_number,buf[1]);	
				printf("\n");	
				signal[0]=0x15;
				write(dev_fd,signal,1); //发送NAK信号
				printf("NAK sent\n");
				memset(buf,0,132); //清空数据包				
				read(dev_fd,buf,132); //读取数据包			
				tcflush(dev_fd,TCIFLUSH); //清空串口接收缓冲区
				print_data_package();
			}
		}
		printf("EOT received\n");
		printf("\n");
		signal[0]=0x06; 
		write(dev_fd,signal,1); //发送ACK信号
		printf("ACK sent\n");
		close(dev_fd); 
		close(file_fd); 
		return 0;
	}
	else
	{
		printf("first SOH not received");	
		printf("\n");	
		close(dev_fd);
		close(file_fd);
		exit(1);
	}
}

/******上位机软件发送按钮对应的C#代码******/

        private void btnSend_Click(object sender, EventArgs e)
        {
            BinaryReader sr = new BinaryReader(File.Open(this.txtFileName.Text,FileMode.Open)); //打开文件
            byte[] dataPackage = new byte[132]; //定义132字节的数据包
            Array.Clear(dataPackage, 0, 132); //清空数据包
            byte[] signal=new byte[132]; //信号
            byte packageNumber=0; //包号
            int i;

            signal[0]=0x01; //起始信号SOH
            sp.Write(signal, 0, 132); //发送起始信号SOH
            signal[0] = (byte)sp.ReadByte();
            if (signal[0] == 0x15) //第一次收到NAK信号
            {
                this.rtbReceive.AppendText("开始传输文件\n");

                while (sr.Read(dataPackage, 3, 128) != 0) //文件没有结束,则从文件中读取128字节数据,并打包发送
                {
                    dataPackage[0] = 0x01; //包头SOH
                    dataPackage[1] = packageNumber; //包号
                    dataPackage[2] = (byte)~packageNumber; //包号取反
                    dataPackage[131] = 0; //清零校验码
                    for (i = 3; i < 131; i++)
                    {
                        dataPackage[131] += dataPackage[i]; //计算检验码
                    }

                sendPackage:
                    sp.DiscardOutBuffer(); //清空串口输出缓冲区
                    sp.Write(dataPackage, 0, 132); //发送数据包

                    this.rtbReceive.AppendText("发送数据包" + packageNumber.ToString() + "\n");
                    signal[0] = (byte)sp.ReadByte();

                    if (signal[0] == 0x06) //收到ACK信号
                    {
                        packageNumber++; //包号加1
                    }
                    else if (signal[0] == 0x15) //收到NAK信号
                    {
                        this.rtbReceive.AppendText("数据包" + packageNumber.ToString() + "发送失败,重发\n");
                        goto sendPackage; //重发
                    }
                    else
                        this.rtbReceive.AppendText("文件传输错误");
                    Array.Clear(dataPackage, 0, 132); //清空数据包
                }
                signal[0] = 0x04; //EOT信号
                sp.Write(signal, 0, 132); //发送EOT信号
                if (sp.ReadByte() == 0x06) //收到ACK信号
                {
                    this.rtbReceive.AppendText("文件传输成功\n");
                }
                else
                    this.rtbReceive.AppendText("文件传输错误");
            }
            else
                this.rtbReceive.AppendText("文件传输错误");
        }
下面讲讲编程中遇到的问题。遇到的一个主要问题是:一个132字节的数据包有时候会被分两次接收,也就是说第一次buf中接收到的是数据包的前一部分数据,第二次接收到的是后一部分数据,因此两次数据包都不正确,此现象循环往复,导致数据包不断重发,文件永远无法传输成功。

没有经验的我百思不得其解,查阅了众多资料,反复调试,终于找到了原因。原因就出在串口的c_cc[VMIN]和c_cc[VTIME]参数上。关于c_cc[VMIN]和c_cc[VTIME]的设置网上资料很多,这里就不贴了,下面我仅以一个例子说明在c_cc[VTIME]=0时c_cc[VMIN]的作用。

假设c_cc[VMIN]=10,c_cc[VTIME]=0,read函数的第三个参数给的是15,此时程序已经执行到read函数读取串口设备文件,下面分情况讨论:

若串口接收缓冲区中的数据量小于10字节,则read函数阻塞等待,直至缓冲区接收到10字节数据,然后读取并返回;

若串口接收缓冲区中的数据量大于等于10字节,且小于等于15,则read函数读取串口接收缓冲区的全部数据并返回;

若串口接收缓冲区中的数据量大于15字节,则read函数读取串口接收缓冲区的前15字节并返回。