一、串口说明

莓派3B+上UART串口位于GPIO的8脚和10脚,分别为GPIO8=Tx,GPIO10=Rx。在连接外部接口时,需要交换接口,即GPIO8连接到外设的Rx,GPIO10连接到外设的Tx。Rpi3的接口如下:

Rpi3B+的GPIO8和GPIO10该串口不能直接用,Rpi3B+包含两组串口,一组硬串口ttyAMA0和一组软串口ttyS0,硬串口就是GPIO8和GPIO10,系统默认分配给了蓝牙设备,查询设备外设智能看到ttyS0。因此,需要将硬串口释放出来。

二、ttyAMA0硬串口配置

查看串口配置情况:  ls -l /dev

找到serial,看它映射的是哪个设备。有可能是显示的一个,有可能是两个。

1、关闭ttyAMA0服务

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

2、删除控制台串口输出

sudo vi /boot/cmdline.txt ,删除语句 console=serial0,115200,变成如下:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

3、切换蓝牙为软串口,释放硬件串口

sudo vi /boot/config.txt ,最后一行增加

dtoverlay=pi3-miniuart-bt

4、重启Rpi3

sudo reboot

5、查看设备信息

ls -l /dev

三、使用wiringPi库开发串口

安装wiringPi库后,可以在/usr/linclude找到wiringPi相关的头文件:

要查找wiringPi库的包含头文件在哪里,可以使用find命令查找:

sudo find / -name wiring*

主要是四个头文件:

  1. wiringPi.h 基本IO驱动和常用配置定义;
  2. wiringPiI2C.h I2C驱动的头文件;
  3. wiringPiSPI.h SPI驱动的头文件;
  4. wiringSerial.h Serial驱动的头文件;

串口驱动库主要提供以下接口:

  1. extern int   serialOpen      (const char *device, const int baud) ;//打开串口,输入设备描述符和串口波特率,返回串口的设备ID
  2. extern void  serialClose     (const int fd) ;//关闭串口,
  3. extern void  serialFlush     (const int fd) ;//清空缓存区
  4. extern void  serialPutchar   (const int fd, const unsigned char c) ;//输出一个字符
  5. extern void  serialPuts      (const int fd, const char *s) ;//输出字符串
  6. extern void  serialPrintf    (const int fd, const char *message, ...) ;//格式化输出
  7. extern int   serialDataAvail (const int fd) ;//返回设备缓存区接收到的数据个数
  8. extern int   serialGetchar   (const int fd) ;//从设备ID读取一个字符

新建一个文件myuart.c,如下代码进行测试:

#include<wiringPi.h>
#include<wiringSerial.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
void delay_ms(int ms);
int main()
{int filedevid;int recbytenum;int i;char buf[1024];memset(buf,0,1024);wiringPiSetup();if((filedevid=serialOpen("/dev/ttyAMA0",115200))<0){printf("/dev/ttyAMA0 Open Faild\r\n");return -1;}else{printf("/dev/ttyAMA0 Open with 115200, success\r\n");while(1){recbytenum = serialDataAvail(filedevid);if(recbytenum > 0){i=0;while(recbytenum--){buf[i++] = serialGetchar(filedevid);}printf("Rpi uart recv: %s\r\n",buf);serialPrintf(filedevid,"Rpi uart send: %s\r\n",buf);memset(buf,0,1024);}}}
}

四、编译和测试

编译命令:

gcc myuart.c -o runuart.o -l wiringPi

运行:

五、分析和讨论

上面的方法主要记录了Rpi3的Uart基本操作,但是存在以下问题:

1、串口无法修改奇偶校验、数据位数;

2、数据接收存在分包现象,主要是由于wiringPi库只提供了serialDataAvail函数,因此该串口驱动还需要进一步优化和改进。

可以参考下一篇博文:树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】

树莓派UART串口编程--使用wiringPi库-C开发【1-基础应用】相关推荐

  1. 树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】

    一.前言 上一篇博文记录了使用wiringPi提供的串口驱动wiringSerial.c wiringSerial.h,并基于该驱动对串口进行简单的通信,测试中发现该串口的驱动比较简单,接收数据会存在 ...

  2. ft4232树莓派linux扩展串口,树莓派Linux串口编程实现自发自收

    串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串 ...

  3. 深入浅出VC++串口编程之短信应用开发

    前面数次连载我们以较长的篇幅讲解了串口通信的硬件原理.DOS平台控制以及基于WIN32 API.控件和第三方类的串口编程.作为本系列文章的最后一次连载,本章将给出一个典型的应用实例:西门子短信服务模块 ...

  4. 树莓派4B PWM温控风扇 wiringpi库 PWM调整频率 54M PWM频率不对

    总结 很多博客文章都是说树莓派PWM是按19.2M基频率来算的,今天用逻辑分析仪抓了一下波形后发现频率有问题,然后按测得的频率反推,算出来我这里好像是按54M的时钟频率来的,不清楚是什么情况.我这里的 ...

  5. 关于linux下UART串口编程的困惑

    之前对struct termios结构体的几个字段一直困惑,主要不知道它的作用,内核对应的struct ktermios结构体如下 struct ktermios {tcflag_t c_iflag; ...

  6. 树莓派交叉编译(PS交叉编译链下载安装、配置永久环境变量、带WiringPi库交叉编译、软链接)

    目录 一.本章概述 二.交叉编译工具链的下载安装 下载 安装 交叉编译链临时有效 交叉编译链永久有效 三.交叉编译的使用 对比gcc与armgcc PC端交叉编译发送到树莓派运行 四.带WiringP ...

  7. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

  8. 8_UART串口编程

    第八章 UART串口编程 8.1 UART介绍 8.1.1 UART串口简介 ​ UART全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitte ...

  9. 树莓派ZeroW学习笔记【2】wiringPi串口编程

    一.树莓派ZeroW串口(UART)使用环境搭建 根据官方信息(https://www.raspberrypi.org/documentation/configuration/uart.md),树莓派 ...

最新文章

  1. R语言进行dataframe数据左连接(Left join):使用R原生方法、data.table、dplyr等方案
  2. 如何利用报表工具FineReport实现报表列的动态展示
  3. 算法踩坑6-二叉搜索树排序
  4. api怎么写_PHP开发api接口安全验证
  5. NC119-最小的k个数
  6. 【机器视觉】 HDevelop语言基础(六)-错误处理
  7. java锁的膨胀过程和优化
  8. 小程序开发好学吗?需要掌握哪些知识技能?
  9. 从 CVE-2020-1048 到 CVE-2020-17001:Windows打印机模块中多个提权漏洞分析
  10. 查看创建的hive表对应的hdfs文件路径
  11. android开机动画多长时间_Android开机动画及黑屏
  12. Sql Server 数据库出现“可疑”的解决办法
  13. Tcp协议socket通信数据包粘包问题分析及解决方案
  14. 终极邮件搜索群发大师 v3.47 绿色
  15. AXURE版富文本输入框(富文本编辑器)教程+下载
  16. 品味之旅见行见心 ——香港科大EMBA郎酒庄园深度体验之旅
  17. 在UBUNTU 13.1 中使用五笔拼音混合输入法
  18. 潘悟云方言计算机,山东方言精组与见晓组声母的分合研究
  19. 基于mindwave脑电波进行疲劳检测算法的设计(5)
  20. 做社交电商,你还没有用小程序?

热门文章

  1. linux svn log 乱码,解决p42svn中文log乱码的问题
  2. idea mybatis generator插件_SpringBoot+MyBatis+Druid整合demo
  3. php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?
  4. java javax.xml.ws_如何通过javax.xml.ws.Service进行调用
  5. 地址栏 输入 参数 刷新参数丢失_小米11 Pro屏幕参数曝光:2K屏幕+120Hz刷新率
  6. 用java判断一个年份是否为闰年_判断闰年还是平年
  7. 定时关机,适用于windows系统
  8. SuperAgent 中文乱码星号问号问题
  9. [react] react怎么拿到组件对应的DOM元素?
  10. React开发(151):外部引入记得导出