前言
本文为笔者学习笔记,若有错误之处,欢迎指出。
提示:以下是本篇文章正文内容,下面案例可供参考
提示:此处不讲串口通信原理,原理可见,博客:串口通信原理
一、树莓派串口通信
1、配置树莓派的串口(第一次使用串口时,需要配置)
- 把serial打开,这个在当前最新的系统里面,能够直接在Raspberry Pi Configuration里面找到,在Interfaces里面把Serial Port改成Enable,重启即可。
- 修改cmdline.txt配置文件
sudo gedit /boot/cmdline.txt
//删除其中的 console=ttyAMA0,115200
- 修改 inittab文件
>cd /etc/
>sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
- 重启
//重启树莓派
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