背景
我们已经初步了解了C++中调用WiringPi库函数的基本方法,现在,浅谈一下树莓派3如何使用WiringPi进行串口通讯。
硬件准备
接线图
shell键入$ gpio readall
,按照图示,将编码器和树莓派的TX、RX插口互反接好。理论上Vcc不必连接,只要连接TX、RX和GND即可。
通过串口发送数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
#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端就可以看到效果了。
通过串口接收数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#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>)
用于从缓冲区读取一个字节的数据。