qq_39610896 2024-01-12 11:11 采纳率: 62.1%
浏览 7
已结题

两个arduino uno板子通信时语音模块无法正常使用

是这样,我在使用两个arduino uno板子通信,两个板子通过软串口9,8连接,其中板子2通过另一个软串口2,3还连接了asr01语音识别模块,并且两个板子通过gnd共地。现在存在的问题是读取数据存在问题,要么是板子2号只能读取板子1号的数据,要么是只能读取asr01的数据,不能实现都读取成功。这是为什么呢?如何解决呢?

img


上图为分别读取数据的代码

img


上图为定义时的顺序

  • 写回答

19条回答 默认 最新

  • GISer Liu 2024-01-12 11:21
    关注
    获得0.45元问题酬金

    该回答引用自GPT-4,由博主GIS_Liu编写:

    从提供的两张图片中,我们可以看到两个Arduino Uno板子通信时出现了问题,尤其是涉及到语音模块ASR01的使用。关于Arduino通信问题的解决方案,以下是我的建议:

    1. 共地连接:确保两个Arduino板子以及ASR01模块之间的共地(GND)连接是正确的。在通信系统中,共地非常重要,因为它为信号提供了一个共同的参考点。

    2. 软串口使用:Arduino Uno只有一个硬件串口,因此在使用多个串口设备时,需要使用软串口。在Arduino中,可以通过SoftwareSerial库来实现软串口。但是,重要的是要注意,在任何给定时间,只能有一个软串口处于活动状态(即正在监听)。如果你尝试同时监听两个软串口,则可能会丢失数据。通过SoftwareSerial对象的listen()方法可以激活一个软串口,而isListening()方法可以检查软串口是否为当前活动的对象。

    3. 波特率设置:确保所有设备的波特率设置一致。波特率不一致是串口通信中常见的问题来源,它会导致数据传输错误或丢失。

    4. 串口监听策略:如果两个软串口需要同时工作,可以设计一个监听策略,轮流激活每个串口。比如,你可以先监听来自另一个Arduino板子的数据,处理完毕后再监听ASR01模块。使用if (softSerial.isListening())来检查当前哪个串口是活动的,并根据需要切换。

    5. 缓冲区溢出:检查是否存在软件串行缓冲区溢出问题,尤其是在数据传输速率较高时。SoftwareSerial库中的overflow()函数可以用来检测这个问题。

    6. 错误检查:可以通过增加错误检查机制,例如奇偶校验位,来提高数据传输的可靠性。虽然SoftwareSerial库不支持奇偶校验位,但你可以通过软件在发送和接收数据时添加自定义的错误检查。

    7. 串口通信编程实践:确保在发送和接收过程中正确处理了字符串结束符,通常是\n\r\n。在解析接收到的字符串时,这一点尤其重要。

    下面是一个基于上述建议的简化的示例代码片段,这段代码不是完整的程序,但可以给你一个如何管理两个软串口和硬件串口的大致思路:

    #include <SoftwareSerial.h>
    
    // 定义软串口的接收和发送引脚
    SoftwareSerial softSerial1(9, 8); // RX, TX
    SoftwareSerial softSerial2(2, 3); // RX, TX,用于与ASR01模块通信
    
    void setup() {
      // 开启硬件串口,用于调试
      Serial.begin(9600);
    
      // 开启软串口
      softSerial1.begin(4800); // 与另一个Arduino板子通信
      softSerial2.begin(9600); // 与ASR01模块通信
    }
    
    void loop() {
      // 先监听softSerial1
      if (softSerial1.isListening()) {
        // 读取来自另一个Arduino板子的数据
        if (softSerial1.available()) {
          char c = softSerial1.read();
          // 处理接收到的数据
        }
      }
    
      // 然后切换到softSerial2
      softSerial2.listen();
      if (softSerial2.isListening()) {
        // 读取来自ASR01模块的数据
        if (softSerial2.available()) {
          char c = softSerial2.read();
          // 处理接收到的数据
        }
      }
    }
    

    请注意,这段

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 系统已结题 1月20日
  • 赞助了问题酬金15元 1月12日
  • 创建了问题 1月12日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。