树莓派UART串口编程--使用wiringPi库-C开发【1-基础应用】

一、串口说明

莓派3B+上UART串口位于GPIO的8脚和10脚,分别为GPIO8=Tx,GPIO10=Rx。在连接外部接口时,需要交换接口,即GPIO8连接到外设的Rx,GPIO10连接到外设的Tx。Rpi3的接口如下:

Rpi3B+的GPIO8和GPIO10该串口不能直接用,Rpi3B+包含两组串口,一组硬串口ttyAMA0和一组软串口ttyS0,硬串口就是GPIO8和GPIO10,系统默认分配给了蓝牙设备,查询设备外设智能看到ttyS0。因此,需要将硬串口释放出来。

二、ttyAMA0硬串口配置

查看串口配置情况:  ls -l /dev

找到serial,看它映射的是哪个设备。有可能是显示的一个,有可能是两个。

1、关闭ttyAMA0服务

sudo systemctl stop serial-getty@ttyAMA0.service

sudo systemctl disable serial-getty@ttyAMA0.service

2、删除控制台串口输出

sudo vi /boot/cmdline.txt ,删除语句 console=serial0,115200,变成如下:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

3、切换蓝牙为软串口,释放硬件串口

sudo vi /boot/config.txt ,最后一行增加

dtoverlay=pi3-miniuart-bt

4、重启Rpi3

sudo reboot

5、查看设备信息

ls -l /dev

三、使用wiringPi库开发串口

安装wiringPi库后,可以在/usr/linclude找到wiringPi相关的头文件:

要查找wiringPi库的包含头文件在哪里,可以使用find命令查找:

sudo find / -name wiring*

主要是四个头文件:

  1. wiringPi.h 基本IO驱动和常用配置定义;
  2. wiringPiI2C.h I2C驱动的头文件;
  3. wiringPiSPI.h SPI驱动的头文件;
  4. wiringSerial.h Serial驱动的头文件;

串口驱动库主要提供以下接口:

  1. extern int   serialOpen      (const char *device, const int baud) ;//打开串口,输入设备描述符和串口波特率,返回串口的设备ID
  2. extern void  serialClose     (const int fd) ;//关闭串口,
  3. extern void  serialFlush     (const int fd) ;//清空缓存区
  4. extern void  serialPutchar   (const int fd, const unsigned char c) ;//输出一个字符
  5. extern void  serialPuts      (const int fd, const char *s) ;//输出字符串
  6. extern void  serialPrintf    (const int fd, const char *message, ...) ;//格式化输出
  7. extern int   serialDataAvail (const int fd) ;//返回设备缓存区接收到的数据个数
  8. extern int   serialGetchar   (const int fd) ;//从设备ID读取一个字符

新建一个文件myuart.c,如下代码进行测试:

#include<wiringPi.h>
#include<wiringSerial.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
void delay_ms(int ms);
int main()
{
    int filedevid;
    int recbytenum;
    int i;
    char buf[1024];
    memset(buf,0,1024);
    wiringPiSetup();
    if((filedevid=serialOpen("/dev/ttyAMA0",115200))<0)
    {
        printf("/dev/ttyAMA0 Open Faild\r\n");
        return -1;
    }
    else
    {
        printf("/dev/ttyAMA0 Open with 115200, success\r\n");
        while(1)
        {
            recbytenum = serialDataAvail(filedevid);
            if(recbytenum > 0)
            {
                i=0;
                while(recbytenum--)
                {
                    buf[i++] = serialGetchar(filedevid);
                }
                printf("Rpi uart recv: %s\r\n",buf);
                serialPrintf(filedevid,"Rpi uart send: %s\r\n",buf);
                memset(buf,0,1024);
            }
        }
    }
}

四、编译和测试

编译命令:

gcc myuart.c -o runuart.o -l wiringPi

运行:

五、分析和讨论

上面的方法主要记录了Rpi3的Uart基本操作,但是存在以下问题:

1、串口无法修改奇偶校验、数据位数;

2、数据接收存在分包现象,主要是由于wiringPi库只提供了serialDataAvail函数,因此该串口驱动还需要进一步优化和改进。

可以参考下一篇博文:树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值