实验大体流程:
让我们利用rs232串口,把开发板系统中某个文件的内容发送到串口,再通过串口,写回到开发板系统中另外一个文件里面
对应实验指导书位置:
指导书275-280页
本博客内容:
1.实验步骤:详细叙述了实验的步骤和原理
2.注意事项:做实验时可能遇到的问题,我都收集了一下,大家做不通的时候一定要看一看
1.实验步骤
首先,找到源码。因为实验指导书上给的代码路径和实际的代码路径不符合,实际的代码路径在:
第二步,看懂代码。(我上个实验说错了,其实这份代码完全不用修改,直接可以用)
首先我们要说明一个问题:串口通信就是I/O ,而文件读写也是I/O ,两者本质上是一回事。所以在代码中我们可以看到,直接用一个文件句柄(类似文件描述符的东西)去指代串口。因此,对这个文件句柄执行写文件操作,也就相当于向串口发送数据。对这个文件句柄执行读文件操作,等同于从串口读取数据。明白这个概念,这个代码就很好读懂了。
1.writedata函数:
参数解释:fd参数代表串口的文件句柄,file参数代表你要读取的文件。
功能:把file参数所指向的文件里面的内容,拷贝到缓冲区中暂存,然后从缓冲区拷贝到fd参数所指向的串口中去。
2.readdata函数:
参数解释:fd参数代表串口的文件句柄,file参数代表你要写回的文件。
功能:fd所指代的串口中的数据,拷贝到缓冲区中去,并且打印在屏幕终端上,最后,把缓冲区中的串口数据,拷贝到file所指向的文件中去
小结:write是读文件,向串口写;read是读串口,向文件里写。注意不要和c语言里面的文件读写的read和write搞混了
3.main函数
图1:是在提示你:运行这个代码总共要输入4个参数,并且要按照这样的格式。其中 ./uart_rw代表可执行文件; /dev/ttyS1 代表串口; read 或者 write 代表你想要执行read还是write功能; /media/text_w.txt 代表你要读取或者写入的文件,如果前面一个选的是read,这里就是要被写入的文件,如果前面的选的是write,这里就要填被读取的文件(这句话看不懂的,请好好的去看懂writedata函数和readdata函数到底是往哪里读,往哪里写)。
图2:这里fd_dev是一个文件句柄,他代表着串口,待会,会被传到readdata和writedata函数里面当参数。
图3: 这个if else语句判断你选择了read功能还是 write功能,并且分别执行。这里再说一遍argv[3]代表你终端输入的第4个参数,也就是之前提到的你想要读或者写的那个文件。
第三步,编译代码
使用指导书指定路径下的gcc交叉编译环境去编译我们的代码,在源码目录下打开终端,输入如下命令,即可调用相应的编译器去编译源码,生成可执行文件uart_rw
(注:每个人的该编译器的位置可能不一样,稍微注意一下路径)
第四步:将编译出来的可执行文件uart_rw拷贝到sd卡的rootfs目录下(也可以拷贝到rootfs的任何子目录下,只要你能记得住路径)
(有些人可能拷贝不了,所以可以在命令行使用sudo权限拷贝 sudo cp uart_rw /media/tronlong/rootfs)(tronlong代表你虚拟机的用户名,每个人的虚拟机用户名因人而异)
第5步:连线
使用杜邦线将 RS232 串口的 RX 和 TX 引脚对接,如下图所示:(线去找老师要,是一根黄色的10cm的线)
第6步:sd卡启动,执行该可执行文件
首先选择sd卡启动(开关00110)
进入tronlong系统界面后,进入刚才你拷贝可执行文件uart_rw的目录位置,如果你是拷贝在了rootfs根目录,则直接 cd/ 进入根目录即可
进入对应的目录后,创建两个txt文件
给其中一个文件里面添加一点字符,待会作为被读取的那个文件使用。(可使用vi编辑器,具体的命令可以上网去查,这里基本上用到的命令有 i 插入 esc退出编辑 :wq保存并退出)
另一个文件保持空的不动。
我们在终端,输入第一个read命令,执行read操作,read操作的作用是:从串口读取数据,把读到的数据打印到屏幕上,并且同时写回到指定的文件b.txt中。 &符号表示让其在后台运行。 因为此时串口上没有数据,所以运行这行命令以后,不会打印出任何数据。
随后,我们执行write操作(按上下方向键可以从刚才read命令的后台运行模式调出命令输入行),我们输入write命令。write命令的作用是:把指定的文件a.txt中的内容给读出来,输出到串口中去。
此时,神奇的现象发生了:终端上打印出了你事先写在a.txt文件中的字符,同时我们也可以打开b.txt文件查看(可使用命令cat b.txt),发现这些字符同时也被写入到b.txt中去了
案例(我的实验现象):
第7步:总结
write命令调用writedata函数把a.txt文件里面的字符给发送到了串口
read命令调用readdata把串口中的数据给读了回来,然后存在了b.txt文件中。
当我们先运行read命令时,由于串口中还没有任何数据,所以运行时没有任何现象。一旦我们运行write命令,把数据送向了串口,此时后台运行的read命令就会接收到串口上返回的数据,便会立即向控制台打印输出,并且写回文件。
因此:如果我们拔掉刚才串口的那个杜邦线,那么我们将得不到任何现象,屏幕不会打印字符,b.txt文件中也不会有任何内容。因为刚才那根线起到了串口回环的作用,即把RS232串口发送出去的数据再向串口发送回来。
2.注意事项
有些人编译的时候出错,那就只好求别的同学给你编译了。比如我编译文件时,出现了找不到头文件的问题,我找遍大佬都没法给我解决。
注意:拷贝到sd卡上的可执行文件uart_rw有时候替换不掉(有些人之前的可执行文件代码有问题,想把后来编译的新的可执行文件替换进去,但是一直出错,最后才发现是没替换掉,始终在运行旧的可执行文件),所以遇到这种情况,我们可以先用 sudo rm 命令删除旧的可执行文件,然后再用sudo cp 命令去拷贝新的文件
有些人在运行命令的时候 .、uart_rw........
会给你报错,说 permission denied
这大概率是权限问题,用ls -l 看一眼 uart_rw 可执行文件 有没有可执行权限 x ,如果没有可执行权限x,当然跑不起来代码
用chmod 777 uart_rw就可以修改权限变为可执行了
这种现象常出现在到处拷贝粘贴别人的可执行文件的时候(<-_<-)