【问题标题】:Interrupting with SoftwareSerial on Arduino在 Arduino 上使用 SoftwareSerial 中断
【发布时间】:2014-08-03 21:29:35
【问题描述】:

我正在使用蓝牙串行端口配置文件与 Arduino 进行通信。蓝牙模块 (HC-06) 连接到我的数字引脚 10 和 11 (RX, TX)。该模块工作正常,但我需要数据接收中断。我无法定期检查传入的数据,因为 Arduino 正在处理时间敏感的任务(通过无源蜂鸣器播放音乐),我需要控制信号在接收时立即中断。我浏览了许多文档,包括 Arduino 自己的站点,它们都解释了如何使用定期检查 serialPort.available() 来建立定期通信。我发现了一个 SO 问题Arduino Serial Interrupts 但这对我的水平来说太复杂了。关于通过串口读取实时输入有什么建议吗?

【问题讨论】:

  • D11 连接到 PCINT3。发疯。
  • @IgnacioVazquez-Abrams 感谢您提供非常有帮助的回复。
  • playground.arduino.cc/Main/PcInt 我必须为你做一切吗? :P
  • @IgnacioVazquez-Abrams 好的,这对我来说是一个很好的起点。

标签: arduino interrupt software-serial


【解决方案1】:

请注意,当前版本的 SoftSerial 实际上使用 PCINT 来检测各个位。因此,我认为在主循环中再次定义它会与 SoftSerial 对位的实际检测相冲突。

我不愿意建议这样做,因为它正在修改核心库。共享中断时很难不这样做。但如果不顾一切,您可以根据需要修改该例程。

\arduino-1.5.7\hardware\arduino\avr\libraries\SoftwareSerial\SoftwareSerial.cpp.

//
// The receive routine called by the interrupt handler
//
void SoftwareSerial::recv()
{
...
    // if buffer full, set the overflow flag and return
    if ((_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF != _receive_buffer_head) 
    {
      // save new data in buffer: tail points to where byte goes
      _receive_buffer[_receive_buffer_tail] = d; // save new byte
      _receive_buffer_tail = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF;
#ifdef YOUR_THING_ENABLE
      // Quickly check if it is what you want and DO YOUR THING HERE!
#endif
    } 
...
}

但请注意,您仍处于 ISR 中,并且所有中断都已关闭,并且您正在阻塞一切。 在这里,一个人不应该胡思乱想,也不应该磨磨蹭蹭。你有什么东西快点出去吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多