树莓派4B和pc之间进行串口通信(解决报错)

编程入门 行业动态 更新时间:2024-10-12 20:25:18

文章目录

    • 1.开篇简单介绍
    • 2.使用硬件串口,putty之类工具串口登录并控制树莓派开发板
    • 3.使用软件串口,关闭硬件串口,调试与pc串口助手的串口通信
    • 4.通信测试:调用wiringPI库函数编写向pc调试助手循环发送数据"hello world"的程序:
    • 5.解决4中报错(将硬件串口与软件mini串口默认映射对换)
    • 6.写在最后

1.开篇简单介绍

使用设备情况: Raspberry Pi 4 Model B 4g版

​ 系统为官方 Raspberry Pi OS 2021.01.11版

该篇博客是我学习过程的展现,有遇到错误和debug的过程,建议先通览后再参考,可以避免我遇到的问题,节约时间


树莓派4b有2种串口:
1.硬件串口(/dev/ttyAMA0),也称为:串口控制台,可以利用putty之类工具串口登录并控制树莓派开发板(即,可以通过该串口敲linux下的各种命令);
2.软件串口(/dev/ttyS0),与其他嵌入式开发板的串口进行惯常的数据通信。

用USB转TTL去接树莓派时,通常需要接三个线,即:
1、树莓派的GND接USB转TTL的GND
2、树莓派的TX接USB转TTL的RX
3、树莓派的RX接USB转TTL的TX

2.使用硬件串口,putty之类工具串口登录并控制树莓派开发板

在命令行输入

sudo raspi-config

重启系统后就可以通过 putty 的串口登陆树莓派:

3.使用软件串口,关闭硬件串口,调试与pc串口助手的串口通信

在命令行输入

sudo raspi-config

安装minicom ,验证与串口助手的通信功能

sudo apt-get install minicom
minicom -D /dev/ttyS0  #每次启动串口都不要忘记添加 -D /dev/ttyS0,否则会默认选择ttyAMA,导致通信失败,ttyS0 为树莓派4B的串口

默认波特率为 115200,如需设置波特率为 9600 加参数 -b 9600

从pc端串口发送到Raspberry Pi的minicom端

从Raspberry Pi的minicom端发送到pc端串口

打开minicom回显:先按组合键CTRL+A(短按不是长按),松开后再按E,这样能显示迷你com发送给串口助手的数据

先Ctrl+A,再Q,退出minicom。

minicom -s可以设置baud 、端口号等参数

4.通信测试:调用wiringPI库函数编写向pc调试助手循环发送数据"hello world"的程序:

我的文件是放在test文件里的,你可以选择自己的文件夹

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

char *tx="hello word\r\n";

int main()
{
  int fd;
  if(wiringPiSetup()<0)
  {
   printf("Initialize fail!\r\n");
   return 1;
  }

  fd =serialOpen("/dev/ttySO",115200);
  if(fd<0)
  {
   printf("open serial fail!\r\n");
   return 1;
  }
  while(1)
  {
   serialPuts(fd,tx);
   delay(500);
  }
  serialClose(fd);
  return 0;
}

crtl+o保存,回车,crtl+x退出;

然后用gcc进行编译,编译时要链接wiringPI 库;

gcc -Wall -o tx serial.c -lwiringPi  

此时发生报错,没办法打开串口!!!

5.解决4中报错(将硬件串口与软件mini串口默认映射对换)

首先,查看一下串口情况

ls -l /dev


查看资料:树莓派3/4b的外设一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。

硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠;

mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了,虽然你可以固定内核的时钟频率,但这显然不符合低碳、节能的口号。

在所有的树莓派板卡中都通过排针将一个串口引出来了,目前除了树莓派3/4代以外 ,引出的串口默认是CPU的那个硬件串口。而在树莓派3/4代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx。


禁用蓝牙(硬件串口与mini串口默认映射对换)

sudo nano /boot/config.txt

在打开的文件后面添加:

dtoverlay=pi3-disable-bt 

因为蓝牙也使用硬件串口,所以我们在 /boot/config.txt里面加上 dtoverlay=pi3-disable-bt ,ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。

禁用串口的控制台功能

前面的步骤已经交换了硬件串口与mini串口的映射关系,但现在想使用树莓派外接串口模块进行通信还不行,因为树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。

在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能。
由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

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

最后还需要删除一个东西:

sudo nano /boot/cmdline.txt

在打开的文件中删去 console=serial0,115200

最后是这样的

dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

然后对4中的代码进行修改,就是把ttyS0改成ttyAMA0

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

char *tx="hello word\r\n";

int main()
{
  int fd;
  if(wiringPiSetup()<0)
  {
   printf("Initialize fail!\r\n");
   return 1;
  }

  fd =serialOpen("/dev/ttyAMA0",9600);//fd =serialOpen("/dev/ttySO",115200);波特率选择115200还是9600随你,这里我选了9600
  if(fd<0)
  {
   printf("open serial fail!\r\n");
   return 1;
  }
  while(1)
  {
   serialPuts(fd,tx);
   delay(500);
  }
  serialClose(fd);
  return 0;
}

成功了,树莓派成功通过串口向上位机发送hello world。

6.写在最后

首先,感谢这些大佬的帖子提供了帮助

树莓派3b/4b通用 + 串口配置:https://blog.csdn/weixin_45437140/article/details/102971270
树莓派和电脑之间串口通信:https://blog.csdn/weixin_53762042/article/details/115417407
树莓派和电脑之间串口通信编程:https://blog.csdn/baidu_39594043/article/details/115288920
树莓派4B串口通信:https://blog.csdn/dingpan119/article/details/107848199

然后,我还有一些想法和大家分享

  1. 使用硬件串口,用putty来使用树莓派的shell,这是我第一次用这种方式来控制,没用过的可以试一下,当是还是不如ssh方便。
  2. minicom使用的是ttyS0,和我们最后使用ttyAMA0来通信是不同的,对minicom不熟悉,不知道这个软件串口怎么在项目里使用,挖个坑,以后填。
  3. 最后,感觉交换了ttyAMA0和ttyS0,然后用硬件串口来通信是最好的,这个时候putty还能不能用大家可以自己去尝试一下。

试了一下,交换了ttyAMA0和ttyS0后,putty就不能用了。

后记:其他可能有用的博文

  • 树莓派4B使用usb转串口通讯模块
  • 树莓派4B和阿里云服务器进行通信
  • 树莓派4B配置静态IP地址

更多推荐

树莓派4B和pc之间进行串口通信(解决报错)

本文发布于:2023-06-14 09:00:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1459078.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:串口   报错   通信   树莓派   pc

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!