树莓派串口笔记

树莓派4B的外设一共包含两个串口

一个称之为硬件串口(/dev/ttyAMA0),

一个称之为mini串口(/dev/ttyS0)。

硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠。

mini串口性能低,功能也简单.

请注意:在默认状态下,serial0(就是GPIO14,15)是映射到ttyS0的(就是MINI串口:/dev/ttyS0),ttyS0的特点是其工作时钟来自于CPU,CPU的时钟呢又是从600MHZ到1.5Ghz动态变化的,所以这个串口经常会因为时钟频率发生变化而发生错误,因此我们不用这个串口。

默认状态下,serial1(跟板载蓝牙相连)映射到ttyAMA0,ttyAMA0是硬件串口,它的时钟频不受CPU影响。因此我们一般都是用的ttyAMA0。

所以我们的第一步就是配置交换映射关系,最终的映射结果如上图我们要把硬件串口ttyAMA0映射到GPIO14,15上

树莓派4b串口通信配置1----_弑梦空间-涛-的博客-CSDN博客

ls /dev -al | grep serial

上图是默认状态

现在操作一下

删除cmdline.txt

console=serial0,115200 

余文是

console=tty1 root=PARTUUID=14b6b696-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

 树莓派串口笔记_第1张图片

没有变化

继续增加2个句子

此时效果变了 BLE消失了 前面很容易成功的案例 也不能成功了

enable_uart=1
dtoverlay=disable-bt

树莓派串口笔记_第2张图片

 也就是现在BLE断来了 为外接蓝牙准备

树莓派入门教程 - 1 - 基础外设篇 - 1.5 树莓派GPIO库wiringPi 串口ttyAMA0与ttyS0的区别 - 程序员大本营



树莓派教程 - 1.4 树莓派GPIO库wiringPi 树莓派串口ttyS0_Mark_md的博客-CSDN博客

补充 可以百度 wiring编码

树莓派-wiringPI-设置引脚编号模式_nicekwell的专栏-CSDN博客

树莓派串口笔记_第3张图片

所以别人都再说15 16  而我看到 here是14 15

树莓派串口笔记_第4张图片

esp-hosted/UART_setup.md at master · espressif/esp-hosted · GitHub

看到只有1个串口

1---启用串口登入【待定】

2--串口发送数据

树莓派串口笔记_第5张图片

 接线 5V5V黑色白色卢瑟【注意红色3.3V不要 看上去好像下电以后PC的USB会持续供电给PI】

树莓派串口笔记_第6张图片

 

跑程序 直接跑不可以

Install and Testing | Wiring Pi

Raspberry Pi | Wiring | Download & Install | Wiring Pi


   14  sudo apt-get install wiringpi
   15  gpio -v
   16  gcc c1.c
   17  gcc -Wall -o c c1.c   -lwiringPi
   18  ls

可以了

树莓派串口笔记_第7张图片

 测试效果

树莓派串口笔记_第8张图片

#include 
#include 
#include 
 
int main(void)
{
    int hs1;
    int snum = 0;
 
    wiringPiSetup();                        // 使用wiring编码去初始化GPIO序号
    //hs1 = serialOpen("/dev/ttyS0", 115200); // 打开 /dev/ttyS0 串口设备,波特率115200
    hs1 = serialOpen("/dev/ttyAMA0", 115200);
    printf("ttyS0 uart test1:\n");          // 终端打印
    serialPrintf(hs1, "Hello World!\r\n");  // 串口打印
    serialPrintf(hs1, "Enter 10 letters:\r\n");
 
    /* 串口缓存区读取10个字节,并完整输出接收到的数据 */
    do{
        snum = serialDataAvail(hs1);        // 获取串口接收缓存区的可用字节数
    }while(snum < 10);
 
    while(snum--)
    {
        serialPutchar(hs1,serialGetchar(hs1));  // 通过串口发送字节
    }
    serialPrintf(hs1, "\r\nserial close\r\n\r\n");  // 串口打印
 
    serialClose(hs1);                       // 关闭串口
    return 0;
}

上面的是测试的 下面的没有测试

#include 
#include 
#include 
 
int main(void)
{
    int hs1;
    int snum = 0;
    int tnum = 0;
    unsigned char chrtmp[100];
    wiringPiSetup();                            // 使用wiring编码去初始化GPIO序号
    //hs1 = serialOpen("/dev/ttyS0", 115200);     // 打开 /dev/ttyS0 串口设备,波特率115200
    hs1 = serialOpen("/dev/ttyAMA0", 115200);
    printf("ttyS0 uart test2:\n");              // 终端打印
    serialPrintf(hs1, "Hello World!\r\n");      // 串口打印
    serialPrintf(hs1, "Enter a paragraph and end with Enter:\r\n");
 
    /* 串口缓存区记录到数组,遇到\n结束,并完整输出接收到的数据 */
    while (1)
    {
        snum = serialDataAvail(hs1);            // 获取串口接收缓存区的可用字节数
        if(snum > 0)
        {
            chrtmp[tnum] = serialGetchar(hs1);  // 从接收缓存区读取一个字节
            tnum ++;
            if(chrtmp[tnum - 1] == '\n') break;
        }
        //delay(2000);
        //printf("%d  ,  %d\n",snum,tnum);
    }
 
    int i = 0;
    while (tnum--)
    {
        serialPutchar(hs1,chrtmp[i++]);         // 通过串口发送字节
    }
    serialPrintf(hs1, "\r\nserial close\r\n\r\n");  // 串口打印
 
    serialClose(hs1);                           // 关闭串口
    return 0;
}

也可以直接发 貌似PI默认是115200

 echo -n "koson" > /dev/serial0
 

树莓派串口笔记_第9张图片

3--串口通讯

你可能感兴趣的:(stm32,物联网,linux)