从树莓派的相关资料我们可以看到,树莓派有两个串口可以使用,一个是硬件串口(/dev/ttyAMA0),另一个是mini串口(/dev/ttyS0)。硬件串口有单独的波特率时钟源,性能好,稳定性强;mini串口功能简单,稳定性较差,波特率由CPU内核时钟提供,受内核时钟影响。

树莓派(3/4代)板载蓝牙模块,默认的硬件串口是分配给蓝牙模块使用的,而性能较差的mini串口是分配给GPIO串口 TXD0、RXD0。

因为树莓派初始时默认把性能较差的mini串口分配给GPIO上的TX、RX。我们要使用性能好的串口就需要把两者交换过来。以下是交换的步骤:

  • 1.运行命令,查看串口分配情况
ls /dev -al

  • 2.由于硬件串口分配给板载蓝牙使用,所以要释放掉,并设置硬件串口分配给GPIO串口。
    首先登陆终端后,输入sudo raspi-config命令进入树莓派系统配置界面,选择第五个Interfacing Options:

  • 3.选择关闭串口登录功能,打开硬件串口调试功能:

    1. 设置硬件串口为GPIO串口
      接着将串口配置为我们的GPIO串口,对输入命令
sudo vim /boot/config.txt
  • 5.将下面两行代码添加到最后:
dtoverlay=miniuart-bt
force_turbo=1

  • 6.树莓派重启,再次输出:
ls /dev -al

可以看到;两个串口互换了位置:

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

首先执行命令如下:

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

然后执行命令:

sudo nano /boot/cmdline.txt
并删除语句console=serial0,115200(没有的话就不需要此步骤)

删除语句:(没有的话就不需要此步骤)

console=serial0,115200
  • 8 测试与验证串口通讯功能
    这里使用三种方式进行测试验证, c语言下使用wiringPi库, python语言下使用serial包,最后命令行使用minicom工具。

先安装以上开发工具:

sudo apt-get install wiringpi
sudo apt-get install python-serial
sudo apt-get install minicom

将usb转ttl模块引脚的GND、TX、RX分别与树莓派的GND、RX、TX连接;电脑端启用串口调试助手,波特率设置一致。

Python语言实现:

# -*- coding: utf-8 -*
import serial
import timeser = serial.Serial("/dev/ttyAMA0",115200)if not ser.isOpen():print("open failed")
else:print("open success: ")print(ser)try:while True:count = ser.inWaiting()if count > 0:recv = ser.read(count)print("recv: " + recv)ser.write(recv)sleep(0.05)
except KeyboardInterrupt:if ser != None:ser.close()

C语言实现:

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>int main()
{int fd;if(wiringPiSetup()<0) {return 1;}//if((fd=serialOpen("/dev/ttyS0",115200))<0) { // gpio 使用mini串口if((fd=serialOpen("/dev/ttyAMA0",115200))<0) { // gpio 使用硬件串口return 1;}printf("serial test output ...\n");serialPrintf(fd,"1234567890abcdef");serialClose(fd);return 0;
}

树莓派上用Python写的串口发送(16进制)、接收数据(16进制),把16进制的数组转成数组,然后提取出来,在转换成16进制,在转换成10进制。

import RPi.GPIO as GPIO
import serial
import time
import binasciiGPIO.setmode(GPIO.BCM)s = serial.Serial("/dev/ttyAMA0",9600)send_data = bytes.fromhex('A3 00 A2 A4 A5')s.write(send_data)time.sleep(1)# rece_data = s.read(10)# 接收返回的16进制数组,并把数组转换成字符print(send_data)rece_data = str(binascii.b2a_hex(s.read(10)))[10:16]rece_data_High_16 = rece_data[0:2]   # 数据高16位rece_data_High_8  = rece_data[2:4]   # 数据高8位rece_data_Low_8   = rece_data[4:6]   # 数据低8位的第1位print(rece_data)print(str("yuanshi:{}".format(rece_data)))print(str("rece_data_High_16 :{}".format(rece_data_High_16)))   # 数据高16位的第1位print(str("rece_data_High_8 :{}".format(rece_data_High_8)))     # 数据高8位的第1位print(str("rece_data_Low_8 :{}".format(rece_data_Low_8)))       # 数据低8位的第1位rece_data_High_16_to_int = int(rece_data_High_16)rece_data_High_8_to_int  = int(rece_data_High_8)rece_data_Low_8_to_int   = int(rece_data_Low_8,16)    # 将16进制转换成10进制# 重量运算计算公式 rece_data_High_16 * 65536 +  rece_data_High_8 * 256 + rece_data_Lowg = ((rece_data_High_16_to_int * 65536) + (rece_data_High_8_to_int * 256) + (rece_data_Low_8_to_int))print("重量:{}".format(g) + "g")time.sleep(3)

树莓派4B的串口使用,并通过串口与其他设备经过通讯协议发送、接收数据。相关推荐

  1. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  2. Python3树莓派连接阿里云物联网设备发送接收数据

    Python3连接阿里云物联网设备发送接收数据(树莓派) 阿里云物联网IOT 代码部分 库文件 Windows下安装环境 树莓派安装环境 可能遇到的错误 代码 效果展示 阿里云物联网IOT 首先,准备 ...

  3. C#利用SerialPort类对串口发送接收数据

    1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...

  4. c# 串口发送接收数据

    /********************** 串口数据接收事件 *****************************/private void SerialPort_DataReceived( ...

  5. 51单片机模拟串口发送接收数据(不使用SBUF)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 51单片机.模拟串口.串口发送.串口接收.逻辑分析仪 前言 一.配置定时器 二.串口发送 三.串口接收 四.主函数 五.波形图 5.1 ...

  6. usart 串口的发送-接收数据(正点改编)

    功能:上位机发送给mcu,mcu原原本本发送给上位机**main关键代码**while(1){if(flag==1){len=usart_sta&0xffff;//接收数据长度,&0x ...

  7. win32 串口阻塞的方式发送接收数据

    参考博文 https://blog.csdn.net/liuzhuomju/article/details/7479507 #pragma once #define RX_CHAR WM_USER+1 ...

  8. STM32串口发送接收数据

    目录 1.串口通信 2.串口的结构体 3.如何配置串口的发送 4.通过串口向电脑发送ok字符 5.封装发送字符串函数 6.重定向printf串口发送 7.串口输入控制LED灯开关 遇到的问题 1.串口 ...

  9. 树莓派4B学习笔记——IO通信篇(UART)

    文章目录 UART简介 树莓派使用UART与串口屏通信 串口屏简介 硬件连接 配置串口接口 树莓派打开UART接口 树莓派安装串口调试助手 编程实现 wiringSerial.h Serial简介 C ...

最新文章

  1. html html示例
  2. C++STL常用查找算法
  3. 领域驱动和MVVM应用于UWP开发的一些思考
  4. 位图像素的颜色 携程编程大赛hdu
  5. linux下swftools 的配置
  6. Vue的router导航重复-报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to curren
  7. 网站开发中敏感信息加密
  8. std在汇编语言是什么指令_汇编语言程序指令整理
  9. 火狐 firefox proxy moz=proxy:// 407错误 解决办法
  10. 使用API网关构建微服务
  11. Java类汽车,JAVA 建立一个汽车AutoMobile类......
  12. 从极客到 CEO,开发者应该如何提升技术领导力?
  13. 【HTML】人生苦短, 快卷快卷 第二课 HTML 基础
  14. 一文读懂矩估计、极大似然估计和贝叶斯估计
  15. Nature子刊 | 褚海燕组-土壤生物多样性与城市绿地生态系统功能(朱永官/韦革宏点评)...
  16. jekyll php,使用Jekyll在Github上搭建个人博客(文章分类索引)
  17. Java设计模式面试专题
  18. web前端项目实战_vue项目仿美团【爱创课堂】
  19. python秒表游戏_如何使用Python 实现秒表功能?
  20. 公司邮箱登录,邮件多长时间能撤回,有时间限制吗?

热门文章

  1. Windows 创建相对路径的快捷方式
  2. python小视频_今日头条Python脚本,支持视频及小视频下载
  3. 企业中必备的五大DDoS防护技术
  4. Fate部署实战——从零开始实现Fate cluster部署
  5. 数据结构4-----线性表的链式存储结构(2)
  6. 给shinelon安装ubuntu 系统
  7. 根据本地浏览器的版本自动更新chromedriver
  8. Flume入门——Selector、Chanel等
  9. pdf转换jpg文件转换器
  10. Python Turtle 绘制勾股树