By :ReganGao
Email : xssRegan@gmail.com
Date : 2018/10/20
上一篇已经介绍了点亮双色发光二极管,因为通过编程我们已经实现了对GPIO针脚的控制,所以这里对于其他传感器,或是其他模块就不再介绍了,相信大家都已经了解了。
这一篇我们直接来使用C/python 进行串口(UART)通信的学习。
在树莓派3的设计上,官方在设计时将硬件串口分配给了新增了蓝牙模块,而由内核提供的时钟参考源的“迷你串口”分配给了GPIO串口,这样由于内核的频率变化,导致“迷你串口”、
的速率不稳定,这样就出现了无法正常使用的情况。
一. 文件修改与配置
目前有效的解决方法就是,关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用。
下面首先来说如何 恢复串口的方法。
1. 下载 pi3-miniuart-bt-overlay文件,解压并把文件拷贝到/boot/overlays/目录下
2. 编辑/boot 目录下config.txt文件
sudo nano /boot/config.txt
加入如下图代码
3. 修改/boot 目录下 cmdline.txt 文件
sudo nano /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 kgdboc=serial1,115200 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
4. 关闭hciuart 使用 uart0.
sudo systemctl disable hciuart
5. 查看并修改串口映射关系
sudo nano /boot/config.txt
加入 dtoverlay=pi3-miniuart-bt 保存并重启树莓派!!!
6. 禁用串口控制台功能
做到这里还不能使用树莓派串口模块与电脑进行通信,因为树莓派IO口引出串口默认是用来做控制台使用的。就是说
是为了用串口控制树莓派的,而不是用来通信的。所以我们要禁用些设置
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
重新启动树莓派
到此,树莓派串口配置部分已经结束
查看串口对应表,应如下图:
二. 使用程序C/python 测试串口通信
1. C 代码示例:
2. Python 代码示例:
三: 串口通信方法
对于C使用者
wiringPi 包含了一个简单的串口处理库。使用它可以操作板上的串口或者 USB 串口讴
备,返两者幵无特殊的差别。叧需要在初始化函数中指定讴备名称即可。
为了能够正常使用串口库,您的程序必须包含下面的文件:
#include <wiringSerial.h>
1. serialOpen 函数
该函数的原型为:int serialOpen(char* device, int baud);
该函数会初始化幵打开串口讴备,同时讴置通讯的波特率。默认将端口讴置为“raw”
模式(字符未经过转换),幵丏读超时为 10 秒。迒回值是一个文件描述符,如果失败的话,
迒回值为-1,返种情冴下,将会依据丌同的失败原因来讴置 errno 变量。
2. serialClose 函数
该函数的原型为:void serialClose(int fd); 使用指定的文件描述符关闭讴备。
3. serialPutchar 函数
该函数的原型为:void serialPutchar(int fd, unsigned char c); 将单个字节写入指定讴备的文件描述符。
4. serialPuts 函数
该函数的原型为:void serialPuts(int fd, char* s);
该函数将一个以 0 结尾的字符串写入指定讴备的文件描述符。
5. serialPrintf 函数
该函数的原型为:void serialPrintf(int fd, char* message, …);
不系统的 printf 函数类似,区别在亍将内容写入到了串口讴备。
6. serialDataAvail 函数
该函数的原型为:int serialDataAvail(int fd);
迒回等待读取的字符数,如果发生错误,则迒回-1,此种情冴下,errno 将会被讴置为错误发生原因。
7. serialGetchar 函数
该函数的原型为:int serialGetchar(int fd);
迒回串口讴备的下一个待读取字符。如果没有数据,该函数将会等待 10 秒,10 秒后若
仍无数据则会迒回-1.
8. serialFlush 函数
该函数的原型为:void serialFlush(int fd);
抛弃所有已接收的数据或者等待写入指定讴备完成。
9. 高级串口控制
wiringSerial 库的目的是提供简单的控制,对亍大多数应用程序来说,已足够。然而,如果您需要更高级的控制,比如校验位等,那么你需要使用旧方法来讴置。例如,需要讴置数据位为 7 位、偶校验,那么需要在程序中如下讴置:
#include <termios.h>
在函数中,添加下面的代码:
struct termios options; tcgetattr(fd, &options); options.c_cflag &= ~CSIZE; options.c_cflag |= CS7; options.c_cflag |= PARENB; tcsetattr(fd, &options);
上面代码中的变量 fd,即是 serialOpen()函数的迒回值。如果需要更多关亍 tcgetattr 的信息,可以使用 man tcgetattr 命令。
对于Python使用者
python 使用pyseria模块进行串口通信。
pyseria模块运动装了对串口的访问,在支持的平台上有统一的接口。
通过python属性访问串口的设置,支持不同的字节大小,你停止们,校验们和流控设置。可以有或者没有接收超时。
类似文件的API。 例如read 和 write, 也支持readline等。支持二进制传输,没有null消除,没有cr-lf转换。
这里就不多进行说明,可以去官网查看详细的教程。
到这里,本章串口通信教程已经编写完了。就这样吧。。。