树莓派使用串口通信(硬件串口)

树莓派3B+

  树莓派3B+内置了一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。在树莓派3代中,由于板载蓝牙模块,硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO(14,15)。
  树莓派的串口默认为串口终端调试使用,如要正常使用串口则需要修改树莓派设置。关闭串口终端调试功能后则不能再通过串口登陆访问树莓派,只能通过ssh或者远程桌面连接树莓派后进行控制。
查看默认值
在这里插入图片描述
  serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口。如图所示,serial0(GPIO串口)默认使用的是ttyS0(mini串口),serial1(蓝牙)使用的是ttyAMA0(硬件串口)。

关闭串口访问

  可以通过桌面的设置,在Raspberry Pi Configuration中将Serial Port设置为Enable,但是Serial Console都要Disable,即关闭串口控制台功能,然后重启树莓派。
在这里插入图片描述
  或者通过命令行:

sudo nano /boot/cmdline.txt
删除console=serial0,115200,也就是关闭console,其余保持不变.
蓝牙和GPIO交换串口

  为了在树莓派3中通过GPIO使用高性能的硬件串口,我们必须将分配给蓝牙使用的硬件串口与分配给IO排针的mini串口进行对换,这必然会使得蓝牙模块的功能受到影响,不过这里我们不使用蓝牙。
  这一步很简单,只需要在/boot/config.txt加上

dtoverlay=pi3-miniuart-bt
然后重启~sudo reboot。

重启之后查看映射:
在这里插入图片描述
可以发现,GPIO连接了ttyAMA0硬件串口,蓝牙连接了ttys0 mini串口。

硬件连接

  这里我使用的是USB TO TTL模块,将树莓派的串口通过USB TO TTL模块连接到电脑的usb。
在这里插入图片描述

minicom安装与启动

  minicom是linux下的一个串口调试工具。

安装minicom

sudo apt-get install minicom      #安装minicom
  启动minicom之前,得先配置一下,不然没法在minicom下输入。

  (1)sudo minicom -s
  (2)进入Serial port setup界面
  (3)时F - Hardware Flow Contorl项为Yes,按下F键就修改为No了,即关闭硬件流控,回车回到上级菜单
  (4)选择| Save setup as dfl |,然后选择 Exit from Minicom 重启minicom,这样就可以输入命令了。

启动minicom

  注意这时候启动的硬件串口

sudo minicom -D /dev/ttyAMA0 -b115200   #启动minicom

  启动之后,Ctrl-A -> Z -> E
在这里插入图片描述
  这时候,就可以输入了。

在这里插入图片描述
  测试串口收发,成功。同时可以看到图中开启的是硬件串口。在这里插入图片描述

参考:https://blog.csdn.net/weixin_44231148/article/details/115460652

树莓派USB与arduino通信

声明:虽然内容大部分为作者引用(均已附上原址链接),但是未经作者允许,谢绝整版转载。

1.安装pyserial模块

>>wget http://pypi.python.org/packages/source/p/pyserial/pyserial-2.7.tar.gz

>>tar -zxaf pyserial-2.7.tar.gz解压默认在pyserial-2.7目录下

>>cd pyserial-2.7

>>python setup.py install

这种手动安装方式会出现很多问题,可能和环境有关,最后换用pip安装(pip是最初和python一起安装的)

>>pip install pyserial(安装成功)可能会出现大片红色报错,多试几次就ok了

参见https://blog.csdn.net/testcs_dn/article/details/53178076

2.使用arduino和树莓派usb通信,测试串口

(1)arduino写串口通信,并测试通过

https://www.cnblogs.com/aiyauto/p/7071712.html

Serial.begin()函数默认8N1

int i;
void setup(){ Serial.begin(115200);
pinMode(13,OUTPUT);}
void loop(){ if(Serial.read()=='o') { for(i=0;i<5;i++) { digitalWrite(13,HIGH); delay(300); digitalWrite(13,LOW); delay(300); }
Serial.println("Hello World!"); }}

(2)树莓派usb口写通信协议

参看https://blog.csdn.net/fhqlongteng/article/details/80417028

>>lsusb 查看usb设备能否识别(可通过拔插判断)

>>ls -l /dev/tty* 查看所有设备,tty是指终端设备https://blog.csdn.net/a746742897/article/details/52302394


运行以下命令可以查看到默认的串口分配方式:

ls /dev -al

在这里插入图片描述
由于硬件串口分配给板载蓝牙使用,所以我们要释放掉,并且设置硬件串口分配给GPIO串口。

1.ssh登录树莓派系统之后

sudo raspi-config

进入树莓派系统配置界面,选择第五个Interfacing Options:

在这里插入图片描述
进入P6 Serial
在这里插入图片描述
选择关闭串口登录功能,打开硬件串口调试功能:
在这里插入图片描述
在这里插入图片描述
完成后提示以下界面,按OK

在这里插入图片描述
退出raspi-config设置,并根据提示重启树莓派。

2.设置硬件串口为GPIO串口

编辑/boot目录下的config.txt文件

sudo nano /boot/config.txt
添加下面两行到最后:
dtoverlay=pi3-miniuart-bt

force_turbo=1
修改后的如下图片所示

在这里插入图片描述

保存:Ctrl+O,退出Ctrl+X。

重启树莓派

sudo reboot
重启树莓派后,再次输入ls /dev -al,可以看到两个串口已经互相换了位置:

在这里插入图片描述

3.minicom串口助手测试

安装minicom

sudo apt-get install minicom
安装完成后启动minicom
minicom -D /dev/ttyAMA0 -b 9600
其中-D表示选择串口**/dev/ttyAMA0**,-b 设置波特率为9600,此参数可以不用设置,默认115200。

在这里插入图片描述
打开串口就可以通过USB转TTL模块来传输数据了。

退出minicom的操作比较麻烦,根据提示,需要先按Ctrl+A,再按Z,弹出以下菜单,
在这里插入图片描述
接着按X,最后选YES按回车确定。

USB转TTL模块连接如下图:

4.C语言测试代码,打印hello world

代码如下:

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>

int main()
{
    int fd;
    if(wiringPiSetup() < 0)return 1;

    if((fd = serialOpen("/dev/ttyAMA0",9600)) < 0)return 1;

    printf("serial test start ...\n");

    serialPrintf(fd,"Hello World!!!\n");

    while(1)
    {
        serialPutchar(fd,serialGetchar(fd));
    }
    serialClose(fd);

    return 0;
}

在这里插入图片描述
新建testCom.c文件,并把上面的代码复制进去

nano testCom.c
保存:Ctrl+O,退出Ctrl+X。

使用gcc编译器来编译程序:

 gcc testCom.c -o test -lwiringPi
运行程序
./test
在这里插入图片描述

也可以从串口发送数据给树莓派,树莓派会直接返回给串口显示。

注意:如果出现了显示乱码的情况,请检查一下波特率,需要设置为9600,与以上代码对应。

参考:https://wusiyuan.blog.csdn.net/article/details/107450937

1.树莓派串口控制台功能

在2018-10-09-raspbian-stretch.img镜像中,要使用串口来调试设备,需要修改conig.txt文件。

1. sudo systemctl disable hciuart 禁用蓝牙设备

2.sudo nano /boot/config.txt

在该最后加上一行

dtoverlay=pi3-miniuart-bt

3.sudo raspi-config,将系统启动设置为串口自动登录 启动方式

4.sudo reboot 即可使用串口了

树莓派3B+的硬件电路图如下:

我们将串口模块的TX、RX、GND连接到树莓派的UART0 RX、UART0 TX、GND,电源不用接,即可使用串口进行控制

 

2.如何让树莓派与其他设备使用串口进行通信呢?

配置这个功能可以让我们的树莓派与其他设备例如stm32进行数据的交互和通信,实现两者之间的互相控制功能,这个还是非常实用的!

使用以下步骤即可:

树莓派包含两个串口

1.硬件串口(/dev/ttyAMA0),硬件串口由硬件实现,有单独的波特率时钟源,性能高,可靠。一般优先选择这个使用。

2.mini串口(/dev/ttyS0),mini串口时钟源是由CPU内核时钟提供,波特率受到内核时钟的影响,不稳定。

想要通过树莓派的GPIO引脚进行稳定的串口通信,需要修改串口的映射关系。

serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口,可以使用 ls -l /dev/serial* 查看当前的映射关系

1.sudo raspi-config

Interfacing Options -> P6 Serial, 第一个选项(would you like a login shell to be accessible over serial?)选择NO,第二个选项(would you like the serial port hardware to be enabled?)选择 YES

然后我们可以通过使用ls -l /dev/serial* 查看串口映射关系发现

serial0(GPIO串口)默认使用的是ttyS0(mini串口),serial1(蓝牙)使用的是ttyAMA0(硬件串口)

如果想使用稳定可靠的硬件串口,就要将树莓派3的硬件串口与mini串口默认映射对换。而这个需求官方也考虑到了,在系统中放了一个实现这个功能的文件---stretch版本系统中的文件为/boot/overlays/pi3-miniuart-bt.dtbo。使用该文件发挥功能只需在/boot/config.txt文件末尾添加一行代码
sudo nano /boot/config.txt

在文件最后面添加一行:dtoverlay=pi3-miniuart-bt

修改完成后 sudo reboot 重启树莓派后使用 ls -l /dev/serial* 查看映射如下:

如上图所示,serial0(GPIO串口)使用的是ttyAMA0(硬件串口),而serial1(蓝牙)使用的是ttys0(mini串口)

2.禁用串口的控制台功能

前面步骤已经交换了硬件串口与mini串口的映射关系,但是,现在还不能使用树莓派串口模块与电脑进行通信,因为,树莓派io口引出串口默认是用来做控制台使用的,即是为了用串口控制树莓派,而不是通信。所以我们要禁用此默认设置。

首先执行命令如下:

sudo systemctl stop serial-getty@ttyAMA0.servicesudo systemctl disable serial-getty@ttyAMA0.service

然后执行命令行:

sudo nano /boot/cmdline.txt

删除语句 console=serial0,115200 (没有的话就不需要此步骤)

保存之后其内容如下:

接下来再次重启树莓派即可。

最终的/boot/config.txt文件内容如下:

3.测试验证串口功能

代码如下:

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int main(){ int fd; if(wiringPiSetup()<0) { return 1; }
if((fd=serialOpen("/dev/ttyAMA0",115200))<0) { return 1; }
printf("serial test start ...\n");
serialPrintf(fd,"hello world!!\n");
serialClose(fd); return 0;}

编译命令:

gcc test.c -o test -lwiringPi

代码中使用到wiringPi库,具体该库的下载和使用可以参考官网:http://wiringpi.com/,里面描述了如何使用该库,这里不做介绍

执行:./test

我们可以将串口模块通过杜邦线插到树莓派的UART0 TX RX接入到PC机,在PC机上打开串口调试助手查看 执行上面命令后会打印 hello world 的字符串,说明通信成功。

同理,我们可以在树莓派上安装minicom,配置好 /dev/ttyAMA0 后在串口调试助手上发送字符串,树莓派minicom串口也能收到对应的字符串,说明两者通信成功

参考:https://blog.csdn.net/zz531987464/article/details/83188189