在Arduino上中断SoftwareSerial

时间:2014-08-03 21:29:35

标签: arduino interrupt software-serial

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

1 个答案:

答案 0 :(得分: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状态且所有中断都已关闭且您正在阻止所有情况。 一个人不应该懒散,也不应该在这里。你快点出去了吗?