ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-05-23 17:01:09  阅读:542  来源: 互联网

标签:树莓 缓存 UART wiringPi int 描述符 fd 串口


一、树莓派ZeroW串口(UART)使用环境搭建

根据官方信息(https://www.raspberrypi.org/documentation/configuration/uart.md),树莓派ZeroW的CPU内部有两个串口,一个PL001 UART和一个Mini UART。其中Mini UART没有时钟源,必须由内核提供时钟源。因为内核频率本身是变化的,从而导致Mini UART速率不稳,基本无法使用。另外树莓派ZeroW没有将PL011 UART分配GPIO中的UART(GPIO14和GPIO15)上,而是将其分配给了蓝牙模块。所以我们需要关闭蓝牙释放PL011 UART转移到GPIO14/15上,才能正常使用PL011 UART。

学习笔记-Raspberry Pi Zero W-4:串口(UART)的配置和使用_第1张图片

【1】查看映射关系

$ sudo ls -l /dev

如上图所示:serial0是GPIO14/15上的UART,ttyAMA0是PL001 UART,这是我已经修改好环境将两者连接起来的结果。

(1)修改cmdline.txt文件

$ sudo vim /boot/cmdline.txt

删除console对应的字段

(2)关闭板载蓝牙

$ sudo systemctl disable hciuart

编辑config.txt文件

$ sudo vim /boot/config.txt

增加如下一行:

dtoverlay=pi3-disable-bt

重启树莓派

$ sudo reboot

(3)禁用串口的控制台功能

再次编辑config.txt文件,增加如下一行:

enable_uart=1

然后重启树莓派

至此GPIO14/15的UART串口应该就能正常使用了。

 

二、wiringPi串口函数定义:

 函数功能参数返回值备注
1int serialOpen (char *device, int baud)  打开并初始化串口

device

串口的地址,也就是Linux中就是设备所在的目录,树莓派ZeroW用的是"/dev/ttyAMA0"。

 

baud

波特率

正常返回文件描述符,否则返回-1失败。 
2void serialClose (int fd) 关闭fd关联的串口

fd

文件描述符

  
3void serialPutchar (int fd, unsigned char c) 串口发送一个字节的数据

fd

文件描述符

 

c

要发送的数据    

  
4void serialPuts (int fd, char *s) 串口发送一个字符串

fd

文件描述符

 

s

发送的字符串,字符串要以’\0’结尾

  
5void serialPrintf (int fd, char *message) 和系统函数printf一样发送数据到串口

fd

文件描述符

 

message

格式化的字符串

 系统函数printf是将信息打印到shell中
6int serialDataAvail (int fd)获取串口接收缓存中的字节数,以便后续能准确接收。

fd

文件描述符

串口缓存中已经接收的,可读取的字节数,如果返回-1表示错误 
7int serialGetchar (int fd)  从串口缓存中读取一个字节数据

fd

文件描述符

读取到的字符,如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1。为了提高接收效率,在读取缓存前,先获取接收缓存的有效字节数,然后根据需要读取,避免出现等待。
8void serialFlush (int fd)刷新,清空串口缓冲中的所有可用的数据

fd

文件描述符

  
9size_t write (int fd,const void * buf,size_t count) 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>,用于通过串口大量发送数据。

buf

需要发送的数据缓存数组

 

count

发送buf中的前count个字节数据

实际写入缓存的字符数,错误返回-1 

当要需要大量发送时,wiringPi建议使用这个函数。
10size_t read(int fd,void * buf ,size_t count) 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>,用于通过串口大量接收数据。

buf

接收的数据缓存数组

 

count

接收的字节数

实际从缓存中读取的字符数当要需要大量接收时,wiringPi建议使用这个函数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、串口通信实例

#include <stdio.h> 
#include <errno.h>
#include <string.h>

#include <wiringSerial.h> //使用wiringPi串口函数库

int main(int argc, char *argv[])
{
    int fd;
    if ((fd = serialOpen("/dev/ttyAMA0", 115200)) < 0) //初始化串口并获取文件描述符保存到fd变量里
    {
     fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
     return 1 ;
    }

    serialPuts(fd, "Raspi Zero W UART Test Start!");

    for (;;)
    {
      if (serialDataAvail(fd) > 0) //查询接收缓存是否有数据
      {
       serialPutchar(fd,serialGetchar(fd)); //从接收缓存中读取一个字节数据并送入发送缓存中,实现串口环回。
      }

    }

    return 0;
}

将上述代码保存为uart_inout.c

$ gcc uart_inout.c -o uart_inout -l wiringPi

编译后输出uart_inout文件并执行

$ ./uart_inout

 

 

标签:树莓,缓存,UART,wiringPi,int,描述符,fd,串口
来源: https://blog.csdn.net/ktd007/article/details/117195629

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有