前面介绍了python操作串口的方法,是通过通用的串口库实现的。
用c语言当然也可以通过通用串口接口实现,而wiringPi也提供了自己的一套串口操作函数,可以很方便地操作串口。
事实上,wiringPi就是在上层利用通用串口操作接口,封装了一套自己的库函数。

概述

在前面python串口编程处就介绍了,树莓派3B的板载串口被蓝牙占用,但可以方便地使用USB串口模块。

树莓派的板载串口是给系统登录使用的,我们要先把这个功能关掉。
sudo raspi-config
Advanced Options –> Serial –> 关闭串口 –> 重启

树莓派上有两个串口,一个硬件串口,工作稳定,但是分配给了蓝牙;还有一个“mini-uart”,这个串口的时钟是由内核提供,所以不太稳定 。 在树莓派3B上,蓝牙和硬件串口是不能兼得。
这个链接(http://ukonline2000.com/?p=880)有介绍如何把硬件串口分配到GPIO14、GPIO15上,这里不做介绍了。

总之,在树莓派3B上,想要使用板载硬件串口是比较麻烦的,我们这里使用的是USB转串口模块,也能很方便地使用串口。

0、包含头文件

#include <wiringSerial.h>

1、打开串口

<fd> = serialOpen(char* device, int buad);
【功能】
打开串口文件,并设置波特率,返回文件编号。
【输入】

*device 设备路径的字符串。比如 “/dev/ttyUSB0”
buad 波特率,是一个数值。可以设置为:2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200

【输出】一个文件编号,代表这个串口设备文件,后面对这个串口的操作都会用到。
【说明】
1、wiringPi提供的设置(以及后面的读写功能)是简化的文件操作,可以满足大部分需求。
2、这里的是标准的linux文件描述符,可以使用linux标准的文件操作函数write()、read()等来操作。

后面也会有说明,wiringPi提供的读写功能是简化的,不提供二进制数值读写,但是可以使用linux标准的读写函数来操作。

2、写入(发送)

void serialPutchar(int fd, unsigned char c) ;
【功能】发送一个字节数据。
【输入】
fd是打开串口时的文件描述符。
输入的就是一个字节数据,可以用字符表示,也可以用十六进制数表示。

void serialPuts(int fd, char *s) ;
【功能】发送字符串。
【输入】
fd是打开串口时的文件描述符。
*s 是一个字符串,会发送该字符串,直到’\0’结束。‘\0’不会发送出去。

void serialPrintf(int fd, char *message, …) ;
【功能】功能类似于printf,可以同时发送多个字符串。

注意:以上两个发送函数只是把数据推送到发送缓冲区里,不会等待串口发送完成。后续程序如果要用到用到串口返回数据应当要考虑到串口传输时间。
并且最好等之前的数据全部发送完成后再发送新数据,否则可能会出问题,这也要考虑到串口发送数据的时间,可能需要等待。
关键是上层还没有找到判断串口发送完成的方法。

3、读取(接收)

int serialDataAvail(int fd) ;
【功能】获取接收缓冲区里的字节数。
【输入】创建串口设备文件时的文件描述符。
【输出】接收缓冲区里所存放的数据字节数。

int serialGetchar(int fd) ;
【功能】从接收缓冲区里读取一个字节数据。
【输入】创建串口设备文件时的文件描述符。
【输出】读取到的一个字节内容。虽然是一个字节内容,但仍然定义为了int型。
【说明】
如果缓冲区里没有数据,则会等待10s,相当于python里把timeout设置为10s。
10s过后如果还没有数据的话,则会返回 -1,十六进制显示为 0xffffffff。
这里的10s是wiringPi默认的,查看源代码可以看到:
1.png

4、缓冲区操作

void serialFlush(int fd) ;
清空缓冲区,放弃所有数据。

5、关闭串口

void serialClose(int fd) ;


本站所有文章欢迎转载,但请保留作者信息和原文地址。

Comments