树莓派串口通信


前言

本文为笔者学习笔记,若有错误之处,欢迎指出。


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

提示:此处不讲串口通信原理,原理可见,博客:串口通信原理

一、树莓派串口通信

1、配置树莓派的串口(第一次使用串口时,需要配置)

  1. 把serial打开,这个在当前最新的系统里面,能够直接在Raspberry Pi Configuration里面找到,在Interfaces里面把Serial Port改成Enable,重启即可。
  2. 修改cmdline.txt配置文件
sudo gedit /boot/cmdline.txt
//删除其中的 console=ttyAMA0,115200
  1. 修改 inittab文件
>cd /etc/
>sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
  1. 重启
//重启树莓派
sudo reboot  

2、串口通信常用API简介

函数原型 参数及返回值 说明
int wiringPiSetupGpio (void) 返回:执行状态,-1表示失败 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16,需要root权限
int wiringPiSetupGpio (void) 返回执行状态,-1表示失败 当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表,需要root权限
int serialOpen (char *device, int baud) device:串口的地址,在Linux中就是设备所在的目录。默认一般是"/dev/ttyAMA0",我的是这样的。baud:波特率返回值:正常返回文件描述符,否则返回-1失败。 打开并初始串口
void serialClose (int fd) fd:文件描述符 关闭fd关联的串口
int serialDataAvail (int fd) fd:文件描述符。返回值:串口缓存中已经接收的,可读取的字节数,-1代表错误 获取串口缓存中可用的字节数(用来判断串口缓冲区是否有数据)
size_t write (int fd,const void * buf,size_t count) fd:文件描述符。buf:需要发送的数据缓存数组,count:发送buf中的前count个字节数据。返回:实际写入的字符数,错误返回-1 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>,当要发送到的数据量过大时,wiringPi建议使用这个函数。
size_t read(int fd,void * buf ,size_t count) fd:文件描述符。buf:接受的数据缓存的数组,count:接收的字节数.。返回:实际读取的字符数。 这个Linux下的标准IO库函数,需要包含头文件#include <unistd.h>,当要接收的数据量过大时,wiringPi建议使用这个函数。

3、串口通信代码演示:

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h> 
#include <string.h>
#include <unistd.h>

int main(void) 
{
    
           
        char receiveBuf[128] = {
    
    0};
        char sendBuf[128] = "hello I am is Raspberry!!!";
                
        wiringPiSetup();                        //硬件初始化函数

        int fd = serialOpen("/dev/ttyAMA0",9600);       //打开串口,并设置波特率为9600
        if(fd == -1)
        {
    
           
                perror("serialOpen:");                  //打开失败返回错误信息
                return -1;
        }       
                
        while(1)
        {
    
    
                if(serialDataAvail(fd) != -1)           //判断串口缓冲区是否有数据      
                {
    
    
                        read(fd,receiveBuf,128);        //读取串口缓冲区中的数据(打招呼)
                }
                printf("%s\r\n",receiveBuf);            //窗口打印一下接收到的数据
                write(fd,sendBuf,strlen(sendBuf));      //往串口缓冲区中发送数据(回招呼)
        }

        return 0;
}

未完待续…

参考文章:https://www.cnblogs.com/lulipro/p/5992172.html

猜你喜欢

转载自blog.csdn.net/weixin_51363326/article/details/116496271