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

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

rpi-pins-40-0

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.net/weixin_45437140/article/details/102971270
树莓派和电脑之间串口通信:https://blog.csdn.net/weixin_53762042/article/details/115417407
树莓派和电脑之间串口通信编程:https://blog.csdn.net/baidu_39594043/article/details/115288920
树莓派4B串口通信:https://blog.csdn.net/dingpan119/article/details/107848199

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

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

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

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

  • 38
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 树莓派4B的性能比树莓派400要好。树莓派4B拥有更高的处理器速度和内存容量,使得它可以更好地执行计算密集型任务。此外,树莓派4B还支持更多的接口,可以连接更多的外围设备。因此,如果您需要进行更复杂的任务,例如图像处理和视频播放,那么树莓派4B是更好的选择。 ### 回答2: 树莓派4B和树莓派400都是由英国树莓派基金会发布的单板计算机,拥有相似的硬件架构和特性,但在性能方面有一些差异。 首先,树莓派4B采用了博通BCM2711四核处理器,主频为1.5GHz,配备了1GB、2GB或4GB内存,能够提供强大的计算性能和流畅的多任务处理能力。 而树莓派400则采用了相同的BCM2711处理器,但主频为1.8GHz,乘以一个全尺寸键盘和触控板,使其功能更加集成化和便捷,适合一些需要更高移动性和操作灵活性的应用场景。 总体来说,树莓派400在处理器主频上略有优势,理论上可以提供更高的计算速度。但树莓派4B的内存配置更加灵活,可以根据实际需求选择不同容量的内存,满足更多应用场景的需求。 除此之外,它们的其他硬件配置和接口都是类似的,如双Micro HDMI接口、USB 3.0和2.0接口、千兆以太网口、蓝牙和Wi-Fi等,因此在实际使用中,两者的性能差异并不会太大。 综上所述,树莓派4B和树莓派400都具有优秀的性能和可扩展性,具体选择取决于用户对性能优先还是集成度和便携性优先的需求。 ### 回答3: 树莓派4B和树莓派400都是由英国树莓派基金会开发的单板计算机,它们都具有一定的性能优势。 首先,树莓派4B配备了1.5GHz的四核ARM Cortex-A72处理器,相较于树莓派400的1.8GHz四核ARM Cortex-A72处理器,频率稍低一些。但考虑到两者使用的处理器类型一样,基于Cortex-A72架构,实际上在常规使用中很难察觉到频率差异。 其次,树莓派4B和树莓派400在内存和存储容量上也有一定的不同。树莓派4B提供了不同配置的内存选项,最高可达到8GB LPDDR4-3200 SDRAM,而树莓派400内置了4GB LPDDR4-3200 SDRAM,但不能升级。对于需要更高内存容量的应用,树莓派4B提供了更多选择。 此外,树莓派400和树莓派4B在其他硬件配置上基本相同,都配备了双HDMI接口、Gigabit以太网接口、USB 3.0和USB 2.0接口、Wi-Fi和蓝牙连接等。 综上所述,从性能角度来看,树莓派400在处理器频率上稍有优势,但树莓派4B在内存容量上更具灵活性。因此,根据应用需求来选择适合的机型才是更为重要的考虑因素。如果需要更大的内存容量,可以选择树莓派4B;如果对处理器频率有较高要求,可以选择树莓派400。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值