Git例程源码仓库:/ZhiliangMa/raspberry.git
上一篇介绍 ttyS0串口的用法,说到了此串口利弊,可能会出现乱码,但绝对能满足绝大部分的要求。
本节使用 /dev/ttyAMA0 的方法,实际使用过程中慎用。可能造成无法启动的情况,概不负责,仅供参考。
本节硬件连接和c程序,参考我的上一篇:/Mark_md/article/details/107143057
一开始我是参照下面这篇文章进行的修改,但很快发现了端倪,文件不一致。看到评论区很多都是修改后无法开机。
//08/08/solution-raspberry-pi3-serial-uart-use-issues.html
于是一顿搜索比对,翻到了这种修改方法。从修改原理上讲,应该是更安全的方法:
不需修改启动文件,修改物理映射的方法
输入命名,查看 serial0 和 serial1 链接的对象。
ls -l /dev/serial*
树莓派默认将 serial0 映射到 外接GPIO的15、16脚。默认将 serial1 映射到 BT蓝牙 上。
所以如果想要将 ttyAMA0映射到外部 GPIO上,只需要将 serial0 和serial1 他俩链接的对象互换。
配置开启硬件串口
sudo raspi-config
可能会提示重启。选择 YES。
修改 serial0 和 serial1 的物理映射
sudo vi /boot/config.txt
末尾添加一行:dtoverlay=pi3-miniuart-bt
之后手动重启。
再次查看 serial0 和 serial1 的映射。他俩已经被互换,如果需要使用GPIO上的串口,现在需要指定外设/dev/ttyAMA0。
硬件连接/c程序
硬件连接和c程序,参考我的上一篇:/Mark_md/article/details/107143057
只需要 serialOpen 修改为下面即可:
hs1=serialOpen("/dev/ttyAMA0",115200);//打开/dev/ttyAMA0串口设备,波特率115200
/dev/ttyS0 与 /dev/ttyAMA0 现象不同,区别
从我写的这两个测试代码来看,/dev/ttyS0 和/dev/ttyAMA0的现象并不完全相同。
/dev/ttyS0 更像是单片机中的一个一个字节去查询串口中断。
/dev/ttyAMA0 更像是串口开启了硬件的 FIFO/DMA 。
同样是第一个测试代码,接收串口缓存区读取10个字节,并完整输出接收到的数据。
/dev/ttyS0 的结果是这样的:
/dev/ttyAMA0的结果是这样的:
/dev/ttyAMA0并没有因为我发送了多出10个字节的数据而跳转出来,而是直到这一段数据全部发送完成后才跳出的 do while。
这也就是为什么我说
/dev/ttyS0 更像是单片机中的一个一个字节去查询串口中断。
/dev/ttyAMA0 更像是串口开启了硬件的 FIFO/DMA 。
如果觉得《树莓派教程 - 1.5 树莓派GPIO库wiringPi 使用硬件串口ttyAMA0与ttyS0》对你有帮助,请点赞、收藏,并留下你的观点哦!