某蒟蒻无聊竟用UNO做了个复读机?

不管是手滑还是被标题骗进来的(后者概率应该不大),解释一下这篇文其实只是俺学习软件模拟串口的一个小应用(用的在线仿真网站,tinkercad),本来是想做两机交互的,结果以为每次只能开一个监视器,就把其中一个UNO变成复读机了,直接贴图和代码

接线如下

上面的UNO介绍

  1. 功能 接收从USB硬件串口传来的数据,并通过软件模拟串口传到下面的UNO里,同时时刻留意下面UNO是否传来数据,并及时接收

  2. 代码

    /*
        Name:       uart.ino
        Created:    2022/2/8 10:38:48
        Author:     DESKTOP-EUF0FAK\robinbird
    */
    ​
    // Define User Types below here or use a .h file
    #include "SoftwareSerial.h"
    String a_str = "";
    String hard_str = "";
    SoftwareSerial up_s(5, 2);
    ​
    // Define Functions below here or use other .ino or cpp files
    //
    void read_str()
    {
        while (up_s.available() > 0)
        {
            a_str += (char)(up_s.read());
            delay(3);
        }
        Serial.println(a_str);
        a_str = "";
    }
    void read_hd_str()
    {
        while(Serial.available() > 0)
        {
            hard_str += (char)(Serial.read());
            delay(3);//延时是为了等待输入的字符进入缓冲区
        }
        up_s.println(hard_str);
        hard_str = "";
    }
    ​
    // The setup() function runs once each time the micro-controller starts
    void setup()
    {
        Serial.begin(9600);
        up_s.begin(2400);
    }
    ​
    // Add the main program code into the continuous loop() function
    void loop()
    {
        if(up_s.available() > 0)
            read_str();
        if(Serial.available() > 0)
            read_hd_str();
    }

下面的UNO介绍

  1. 功能 接收从上面UNO传来的数据,并直接原数据传回,同时13号引脚控制小LED灯闪烁

  2. 代码

    /*
        Name:       uart_down.ino
        Created:    2022/2/8 11:16:35
        Author:     DESKTOP-EUF0FAK\robinbird
    */
    ​
    // Define User Types below here or use a .h file
    //
    #include "SoftwareSerial.h"
    String a_str = "";
    SoftwareSerial do_s(3, 4);
    ​
    // The setup() function runs once each time the micro-controller starts
    void setup()
    {
        do_s.begin(2400);
        pinMode(LED_BUILTIN, OUTPUT);
    }
    void read_str()
    {
        while (do_s.available() > 0)
        {
            a_str += (char)(do_s.read());
            delay(3);
        }
        do_s.println("I am a reteller, I retell:");
        do_s.println(a_str);
        a_str = "";
        digitalWrite(LED_BUILTIN, HIGH);
        delay(500);
        digitalWrite(LED_BUILTIN, LOW);
     
    }
    // Add the main program code into the continuous loop() function
    void loop()
    {
        if(do_s.available() > 0)
            read_str();
    }

大概是代码注意事项

  1. 个人通过仿真实践感觉两UNO的通讯的波特率和 UNO与主机通讯的波特率不相同(甚至差得远一些)更好,以免出现乱码

  2. 软串口和硬串口的函数大体相似,大概为了实现功能,都有如下模块

    //检查是否读到缓冲区末尾
    while(abb.available() > 0)
    {
        char c = abb.read();
        str += (char)c;//这里可以来点强转,保证能加上
        delay(3);//给数据一点充分进入缓冲区的时间
    }

  3. 软串口的初始化方法注意一下

  4. 其他:把接线看对,有的板子不是都能PCINT中断,以及注意读谁的数据后,要给谁输出

运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robinbird_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值