树莓派4B通过CH340连接电脑实现USART串口通信(C语言以及Python版本)


前言

树莓派3/4b的外设一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供。在树莓派4代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx。


提示:以下是本篇文章正文内容,下面案例可供参考

一、启动串口

在命令行中输入以下内容:

ls -l /dev

在没有配置过正常情况下看到的应该是:

serial1 -> ttyAMA0

此时,在终端输入:

sudo nano /boot/config.txt

在打开的文件最后面添加:

#ENABLE UART
enable_uart=1

保存退出后,重启树莓派;

reboot

在终端输入:

sudo raspi-config

根据以下步骤进行设置:
选择 Interfacing Options ->Serial ->no -> yes 关闭串口调试功能,打开串口
选择Interfacing Options
在这里插入图片描述
选择serial
在这里插入图片描述
再选择 no,禁用串口登录功能,将串口用于通信。
再选择 yes,启动串口硬件。

在命令行中输入以下内容:

ls -l /dev

在设置中启用串口后,会发现 /dev目录下变成了两个:

serial0 -> ttyS0 和 serial1 ->ttyAMA0

在这里插入图片描述

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

在终端输入:

sudo nano /boot/config.txt

在打开的文件最后面添加:
(注意:树莓派4b也一样是pi3,但不知具体原因是啥)

dtoverlay=pi3-disable-bt 

修改保存后重启树莓派:

reboot

三、查找是否有serial的包

在终端输入:

pip list

查找是否有serial的包,若没有,则在终端输入:

pip install serial

四、CH340分别连接树莓派与电脑

在这里插入图片描述

  1. CH340的USB口端连接电脑USB口
  2. CH340的5P插针分别与树莓派串口引脚相连
  3. VCC <——> VCC、RXD <——> TXD、TXD <——> RXD、GND <——> GND
    在这里插入图片描述

五、python串口通信程序

# -*- coding: utf-8 -*
import serial
import time
# 打开串口,配置波特率为9600,电脑端接收数据波特率也应相同
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():
    while True:
        # 获得接收缓冲区字符
        count = ser.inWaiting()
        if count != 0:
            # 树莓派读取电脑端发送数据,并将此数据重新发送至电脑端
            recv = ser.read(count)
            ser.write(recv)
        # 清空接收缓冲区
        ser.flushInput()
        # 必要的软件延时
        time.sleep(0.1)
    
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()

六、C语言通信程序

//使用ch340实现树莓派和电脑端的通信,文件名“uartex.c”
#include<stdio.h>
#include<stdlib.h>
#include<wiringSerial.h>
 int main(void)
{
    int fd,n;
    char a;
    if((fd = serialOpen("/dev/ttyAMA0",115200))<0)//若无法通信,可检查更改串口波特率
    {
        printf("serial ERROR!!!\n");
    }
    printf("This is just for test================== BY WAN\n");

    serialPuts(fd,"START NOW====>");
    while(1)
    {
        printf("Please input:\n");
        //键盘输入想要发送的数据,并发送
        scanf("%c",&a);
        if(a>0)
        {
            serialPutchar(fd,a);
        }
        //检测对端是否有数据发来,若有则打印出来
        while(n=serialDataAvail(fd)>0)//检测兑端是否有数据
        {
            printf("====返回的数据为===>%c\n",serialGetchar(fd));//若有返回数据,则打印输出
        }
    }
    return 0;
}

总结

通过CH340连接树莓派与电脑,在树莓派中运行Python或C语言程序,在电脑端打开串口助手即可验证是否通信成功。

树莓派4B和STM32之间进行串口通信时,需要使用GPIO引脚以及相应的代码进行连接和配置。下面是一个示例代码,演示了如何在树莓派4B和STM32之间进行串口通信。 在树莓派4B上的代码(Python): ```python import serial # 创建串口对象 ser = serial.Serial('/dev/ttyS0', 115200) # '/dev/ttyS0'为树莓派4B上的默认串口,波特率为115200 # 向STM32发送数据 ser.write(b'Hello STM32!') # 从STM32接收数据 data = ser.readline() print(data) # 关闭串口连接 ser.close() ``` 在STM32上的代码(C语言): ```c #include "stm32f4xx.h" // 配置串口 void USART2_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 配置GPIO引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置USART2 USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStruct); // 启用USART2 USART_Cmd(USART2, ENABLE); } // 发送数据到树莓派 void sendToRaspberryPi(const uint8_t* data, uint32_t length) { for (uint32_t i = 0; i < length; i++) { while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); USART_SendData(USART2, data[i]); } } // 接收树莓派发送的数据 uint8_t receiveFromRaspberryPi(void) { while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET); return (uint8_t)USART_ReceiveData(USART2); } int main(void) { USART2_Init(); // 接收树莓派发送的数据并回传 while (1) { uint8_t data = receiveFromRaspberryPi(); sendToRaspberryPi(&data, 1); } } ``` 需要注意的是,在树莓派4B上,使用的是/dev/ttyS0作为默认串口设备。在STM32上,需要根据硬件连接情况和引脚配置进行相应的修改。以上代码仅供参考,具体的串口连接方式和代码实现可能会因硬件和需求的不同而有所差异。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

儒雅随和锅包肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值