哈工大计算机学院嵌入式系统设计与实现 实验6 基于Linux的UART串口收发实验(新)

实验大体流程:

让我们利用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就可以修改权限变为可执行了

这种现象常出现在到处拷贝粘贴别人的可执行文件的时候(<-_<-)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值