0

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

4

1 回答 1

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 中,并且所有中断都已关闭,并且您正在阻塞一切。在这里,一个人不应该胡思乱想,也不应该磨磨蹭蹭。你快点做点什么,然后出去。

于 2014-08-04T15:14:53.017 回答