如何在Raspberry Pi3(或更高版本)上进行串行工作


Answers:


65

这个答案仍然是正确的,并且更详细地说明了更改的性质,但是当前Raspbian的大多数用户应该只运行sudo raspi-configSelect,Interfacing Options / Serial然后指定是否要使用串行控制台(可能是否),然后是否要启用S​​erial Port硬件(可能是)是)。然后/dev/serial0在访问串行端口的任何代码中使用。

Raspberry Pi3,Pi3B +,Pi3A +,PiZeroW上的BCM2837具有2个UART(与其前代产品一样),但是为了支持蓝牙功能,功能齐全的PL011 UART从接头引脚移到了蓝牙芯片,并且迷你UART可在接头引脚8和10。
(Pi4上的SOC带有附加的UART,但是引脚8和10和蓝牙的默认串行使用与BCM2837相同的2个UART。)

这对于串行接口的用户有许多后果。

/dev/ttyAMA0以前用来访问UART现在连接到蓝牙。
miniUART现在可在上使用/dev/ttyS0
在最新的操作系统软件是有/dev/serial0其选择适当的设备,所以你可以替换/dev/ttyAMA0使用/dev/serial0,并在PI3和早期机型使用相同的软件。

不幸的是,还有其他一些后果:

The mini UART is a secondary low throughput UART  
  intended to be used as a console.
The mini Uart has the following features:
• 7 or 8 bit operation.
• 1 start and 1 stop bit.
• No parities.
• Break generation.
• 8 symbols deep FIFOs for receive and transmit.
• SW controlled RTS, SW readable CTS.
• Auto flow control with programmable FIFO level.
• 16550 like registers.
• Baudrate derived from system clock.

不支持奇偶校验,并且吞吐量受到限制,但后者不应影响大多数用途。

有一个杀手级功能“源自系统时钟的波特率”使miniUART无效,因为该时钟可以动态更改,例如,如果系统进入低功耗模式或处于低功耗模式。

修改remove /boot/config.txt通过在末尾添加以下行来消除此依赖性:

core_freq=250

这样可以解决问题,并且影响不大。在SPI clock frequencyARM Timer还取决于系统时钟。

出于某些奇怪的原因,使用最新的4.4.9内核的Pi3的默认值为DISABLE UART。要启用它,你需要改变 enable_uart=1/boot/config.txt。(这也解决了core_freq这个问题,因此不再需要。)

最后,如果您不使用蓝牙(或使用需求不高),则可以将端口交换回设备树中。中有pi3-miniuart-btpi3-disable-bt模块/boot/overlays/README


谢谢@Milliways的出色解释。我还没做什么...我有一个无线电模块,它使用UART连接到我的树莓派,并且它更喜欢的波特率9600。因此,如果我core_freq=250在ma python脚本中设置然后配置我的波特率,那应该可以工作?另外,如果您可以查看一下,那就太好了:raspberrypi.stackexchange.com/questions/47379 / ...谢谢!
乔治

我已经尝试了/ dev / serial0和/boot/config.txt中的enable_uart = 1,并使用了曾经与raspberry pi 2一起使用的connectioningPi代码,但仍无法启动串行通信(返回条件为-1)。我也尝试了/ dev / S0无济于事。我可能会缺少什么?(也从raspi-config释放了串行端口)。(包括树莓在内的所有内容都是最新的)
ozgeneral,2016年

1
@ OE1如果您有问题,请在新问题而不是在注释中提出。
Milliways

我有点困惑。您如何表示它不支持奇偶校验?我有一个与pi3对话的设备,它必须具有偶数奇偶校验,否则我的系统将无法与之对话。在遵循您的答案和naseer答案之后,我能够成功将pi3运行到我对该程序设置为偶数奇偶校验的设备的程序对话中。
ThN

1
您能补充一下USB转UART转换器应兼容3.3V而不兼容5V。
马尼雅克

20

终于这为我的pi3工作了(操作系统:debian jessie)

请仔细执行以下6个步骤

第1步-将Raspbian Jessie安装到SD卡上,并在连接到网络时引导Pi通过终端或桌面和外壳登录通过以下方式配置系统:

sudo raspi-config

展开文件系统并在高级页面上启用串行,然后退出并重新启动。

步骤2-如果您使用的是jessie新版本,则不需要此步骤。使用以下方法更新系统:

sudo apt-get update

sudo apt-get upgrade

步骤3-装置树设定如下:

将设备树添加到/boot/config.txt以禁用Raspberry Pi 3蓝牙。

sudo nano /boot/config.txt

在文件末尾添加

*如果您想将蓝牙更改为微型端口(坏)

dtoverlay=pi3-miniuart-bt

*如果要禁用蓝牙(良好)

dtoverlay=pi3-disable-bt

退出编辑器,保存您的更改。

第4步-重新启动PI

sudo reboot

步骤5-

a)禁用串行控制台使用以下命令编辑文件

sudo nano /boot/cmdline.txt

删除单词“ console=serial0,115200”或“ console=ttyAMA0,115200

退出并保存更改

b)启用串行控制台使用以下命令编辑文件

sudo nano /boot/cmdline.txt

将该文件更改为以下内容:

dwc_otg.lpm_enable=0 console=tty1 console=serial0(or ttyAMA0),115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

退出并保存更改

第6步-重新启动PI

sudo reboot

-----------------就这样,很开心 ---------------------------- ---


在rpi2上可以正常工作,我已将其连接到蓝牙中继板上并通过AT命令向其发送消息。但是我可以通过这种方式从arduino接收数据吗?
marciokoko

10

Naseer的答案是正确的,但是如果您只是讲了最新的阿拉伯文字,那么答案会很复杂。我需要做的只是将以下行添加到我的config.txt中(例如,在您插入fat32分区上的SD卡的Windows中):

dtoverlay=pi3-disable-bt

然后将其插入,pi将直接在控制台引脚上打印内容。


这怎么工作?蓝牙UART甚至没有连接到GPIO引脚!
德米特里·格里戈里耶夫

4
@DmitryGrigoryev它为我在我的PI 3
THN

2
这为我工作,以及,我发现这个线程帮助澄清了几个小问题:raspberrypi.org/forums/...
克里斯-
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.