赞
踩
开启gpio串口
sudo raspi-config
树莓派包含两个串口
serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口,可以使用 ls -l /dev/serial* 查看当前的映射关系(交换映射的方法不再赘述,要注意树莓派3和4的文件名不一样,3的为pi3-miniuart-bt)
pi@raspberrypi:/dev $ ls -l /dev/serial*
lrwxrwxrwx 1 root root 7 8月 27 15:17 /dev/serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5 8月 27 15:17 /dev/serial1 -> ttyS0
树莓派io口的串口默认是用来做控制台使用的,并不是用来通信,所以我们要禁用此默认设置。
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
修改配置文件
sudo nano /boot/cmdline.txt
删除文本里的 console=serial0,115200 后保存 (没有这条的话就不用动了)
重启树莓派
#include <wiringSerial.h>
函数 | 函数功能 | 参数说明 |
---|---|---|
int serialOpen (char *device, int baud) | 打开并初始串口 | device:串口的地址,在Linux中为设备所在的目录名 baud:波特率 返回:正常返回文件描述符,否则返回-1失败 |
void serialClose (int fd) | 关闭fd关联的串口 | fd:文件描述符 |
void serialPutchar (int fd, unsigned char c) | 发送一个字节的数据到串口 | fd:文件描述符 c:要发送的数据 |
void serialPuts (int fd, char *s) | 发送一个字符串到串口 | fd:文件描述符 s:发送的字符串 |
void serialPrintf (int fd, char *message, …) | 像使用C语言中的printf一样发送数据到串口 | fd:文件描述符 message:格式化的字符串 |
int serialDataAvail (int fd) | 获取串口缓存中可用的字节数 | fd:文件描述符 返回:串口缓存中已经接收的,可读取的字节数,-1代表错误 |
int serialGetchar (int fd) | 从串口读取一个字节数据返回。如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1 | fd:文件描述符 返回:读取到的字符 |
void serialFlush (int fd) | 刷新,清空串口缓冲中的所有可用的数据 | fd:文件描述符 |
gcc a.c -lwiringPi
#include <stdio.h> #include <stdlib.h> #include <wiringPi.h> #include <wiringSerial.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <string.h> int main() { char buf[64] = {0}; int n_read; wiringPiSetup(); int fd =serialOpen("/dev/ttyAMA0",115200); //打开串口 if(fd == -1){ //如果打开串口失败则退出程序 printf("serialOpen failed!\n"); return 0; } if(fork() == 0){ while(1){ memset(buf,0,sizeof(buf)); n_read = read(fd,buf,sizeof(buf)); //子进程一直等待数据接收 if(n_read > 0){ printf("data %dB:%s\n",n_read,buf); }else{ perror("read failed"); //读取失败,打印错误信息 delay(1000); } } }else{ while(1){ serialPrintf(fd,"hello world!!\n"); //父进程每隔三秒发送一次hello world!! delay(3000); } } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。