您当前的位置:首页 > 电子 > 开发板/开源硬件

树莓派GPIO学习笔记-使用WiringPi进行串口通讯

时间:10-25来源:作者:点击数:

背景

我们已经初步了解了C++中调用WiringPi库函数的基本方法,现在,浅谈一下树莓派3如何使用WiringPi进行串口通讯。

硬件准备

  • 树莓派3
  • USB转TTL编码器
  • 杜邦线若干

接线图

wiringPi-readall

shell键入$ gpio readall,按照图示,将编码器和树莓派的TX、RX插口互反接好。理论上Vcc不必连接,只要连接TX、RX和GND即可。

通过串口发送数据

//serial.cpp

#include<iostream>
#include<wiringPi.h>
#include<wiringSerial.h>

using namespace std;

int main()
{
        int MySerial;

        if (wiringPiSetup()<0)
        {
                cout << "Setup Failed!\n";
                exit(0);
        }

        if ((MySerial=serialOpen("/dev/ttyS0", 115200))<0)
        {
                cout << "Serial Failed!\n";
                exit(0);
        }

        while (1)
        {
                serialPrintf(MySerial,"Hello World!\n");
                delay(1000);
        }

        serialClose(MySerial);

        return 0;
}

这个程序完成的功能是通过 串口每1s发送一个Hello World!

要使用串口的话,必须再包含一个头文件wiringSerial.h。这里的变量MySerial只是一个代号,它就类似C++中的文件类型变量,以后操作串口都要通过这个变量。

serialOpen(<dev>,<rate>)这一函数用于打开一个串口设备,类似于打开一个文件(而事实上Linux里硬件就是抽象为文件的)。树莓派3的标准串口是/dev/ttyS0,串口波特率暂设为115200。

在PC端打开串口调试软件,确保波特率一致,打开对应串口,树莓派$ g++ -o SERIAL serial.cpp -lwiringPi编译、$ sudo ./SERIAL运行(这里好像必须要用管理员权限,否则会报错,具体原因未知),在PC端就可以看到效果了。

串口发送数据

通过串口接收数据

//serial-receive.cpp

#include<iostream>
#include<wiringPi.h>
#include<wiringSerial.h>

#define LED 1

using namespace std;

int main()
{
        int MySerial;

        pinMode(LED, OUTPUT);
        if (wiringPiSetup()<0)
        {
                cout << "Setup Failed!\n";
                exit(0);
        }

        if ((MySerial=serialOpen("/dev/ttyS0", 115200))<0)
        {
                cout << "Serial Failed!\n";
                exit(0);
        }

        while (1)
        {
                if (serialDataAvail(MySerial)>0)
                {
                        char ch=serialGetchar(MySerial);
                        cout << ch << endl;
                        int val=ch-48;
                        digitalWrite(LED, val);
                }
        }

        serialClose(MySerial);

        return 0;
}

此段代码的作用是从上位机接收数据以控制LED的亮灭。1代表开,0代表关。

serialDataAvail(<fd>)用于判断串口缓冲区有没有数据,有数据即返回数据的字节量,出错返回-1。serialGetchar(<fd>)用于从缓冲区读取一个字节的数据。

接收数据
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门