这是一个错误案例,今天课上实验,发现了新的问题,推翻了旧的结论。
虽然很不堪回首,但是我还是决定把旧的错误的内容保留,以警示自己不严谨的学习态度。
新文章详见:
旧实验的错误:想当然的去理解main函数参数,导致误把自己定义的文件句柄当做串口,实际上最后做的,是文件到文件的读写,这也正好印证了为什么我的实验不把串口线连上也能做,因为数据根本就没有从串口走一趟。(程序员不好好读代码,后患无穷)
旧实验部分:
实验目的:
让我们利用串口,把板子上文件内容输入到串口显示(发),再把串口中的数据读取写回到系统文件中(收)
实验任务:
使用交叉编译环境,编译我们的串口收发实验的源码uart_rw.c(源码需要小改动)(也有同学做了不改动源码的实验方案),将生成的可执行文件uart_rw拷贝到sd卡的rootfs分区下,将sd卡插入板子,选择sd卡启动板子,在secureCRT终端界面操作我们的系统,创建两个txt文件a.txt和b.txt , 在a.txt文件中输入一些字符并且保存文件,然后运行我们的串口可执行文件,命令如下:
./uart_rw a.txt b.txt
就可以吧a.txt文件里面的内容输出到secureCRT终端上显示,并且同时把终端上显示的数据保存到b.txt文件中去。实验就算完成了
对应实验指导书的位置:
279页
1.实验步骤
首先,找到源码。因为实验指导书上给的代码路径和实际的代码路径不符合,实际的代码路径在:
然后,修改代码,不同的人可能有不同的修改方式,有些同学最后不用修改代码也能做,但是好像要插一根线(实验指导书里面有) ,但是他们的方法我不太会,所以我就说我的方法,
代码里面各个函数的功能
当我们知道函数的功能后,我们就应该这样修改main函数里面的代码:
注释掉旧的main函数参数获取方式,把4改成3(因为我们只需要3个参数),同时把旧的printf注释掉,换成新的参数输入格式,记住,待会我们输入参数的方式就是根据新的参数命令格式来:
./uart_rw 被读的文件 被写的文件
注释掉原本的if else语句,把里面调用readdata 和 writedata的函数拿出来,注意两个函数的顺序,注意两个readdata和writedata函码里面的传参改成2
(为什么改成2我也不知道,反正就是好使,具体的求大佬来解释把,我个人觉得应该改成1和2才对)
![]()
第三步,编译,使用指导书给的gcc交叉编译环境去编译我们的代码,在源码目录下打开终端,输入如下命令,即可编译源码,生成可执行文件uart_rw
(注:每个人的该编译器的位置可能不一样,稍微注意一下路径)
第四步:将编译出来的可执行文件拷贝到sd卡的rootfs目录下
(有些人可能拷贝不了,所以可以在命令行使用sudo权限拷贝 sudo cp uart_rw /media/tronlong/rootfs)
第5步:用sd卡启动板子(00110),
在secureCRT终端上进入根目录 cd/
ls一下,看uart_rw可执行文件在不在该目录下
创建两个文件a.txt b.txt (可使用命令touch a.txt)
用vi编辑器打开a.txt,往里面随便写点东西,保存(vi 命令可编辑该文件 , i 插入 esc键退出编辑 :wq退出并且保存文件)
执行命令: ./uart_rw a.txt b.txt
就可以把a.txt文件里面的字符输出到终端上,同时把这些内容保存到b.txt文件中
(注意:有同学反应,这2个txt文件是一次性的,待会给老师演示的时候,需要重新创建两个txt文件,再搞一遍)
2.注意事项和可能出现的错误
有些人编译的时候出错,那就只好求别的同学给你编译了
有些人拷贝文件的时候不行,可使用sudo cp命令 sudo cp uart_rw /media/tronlong/rootfs (注:tronlong 是虚拟机用户名,具体取决于你的虚拟机的名字)
注意:拷贝到sd卡上的可执行文件uart_rw有时候替换不掉(有些人之前的可执行文件代码有问题,想把后来编译的新的可执行文件替换进去,但是一直出错,最后才发现是没替换掉,始终在运行旧的可执行文件),所以遇到这种情况,我们可以先用 sudo rm命令删除这个文件,然后再用sudo cp命令去拷贝新的文件
有些人在运行代码的时候 ./uart_rw a.txt b.txt
会给你报错,说 permission denied
这大概率是权限问题,在secureCRT终端用ls -l看一眼uart_rw可执行文件的权限是不是可执行x ,如果没有可执行权限,当然跑不起来代码
用chmod 777 uart_rw就可以修改权限变为可执行了