Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3930|回復: 5
打印 上一主題 下一主題

Arduino SPI 可以中斷接收嗎?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2018-8-15 17:39:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位好:
請問SPI通訊可以讓Arduino先暫停接收,之後再用指令讓Arduino繼續接收嗎??
我希望可以透過Serial輸入CMD來控制是否要開始收值,
加入星號程式碼後碰到的問題是,
1.收到的值個數正確但會有奇怪數字

原本正常的畫面↑


加了*號程式碼後變成上圖這樣

2.輸入 C 指令後可以停止接收,但是再輸入 O 指令沒辦法再讓他被喚醒。


以下是我的code
void setup()
{
  Serial.begin(250000);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  openSPI();
}

void loop()
{
  p = frame_buffer;
  delay(100);
  readFrame();
  delay(200);
  sendLeptonFrame();
  
  
* if (Serial.available() > 0){
    *cmd = Serial.readStringUntil('\n');
    *if(cmd == "C"){
     * closeSPI();
     * runonce = false;
    *}
    *else if(cmd == "O"){
     * runonce = true;
   * }
    *delay(100);
   *}
    *if(runonce){
        closeSPI();
        delay(10);
        openSPI();  
    *}   
   *}
}

void openSPI(void)
{
  SPI.begin(10);
  SPI.setClockDivider(10,8);    //Due 84MHz / 8 ~= 10MHz SPI clk
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE3);
}

void closeSPI(void)
{
  SPI.end(10);
}

是哪部分有出錯了嗎?
還是說有其他可以控制SPI的方法嗎?


新手上路,請多指教,謝謝!
推薦
發表於 2018-8-15 19:41:08 | 只看該作者
你在 C 那邊 closeSPI 一次
O  那邊 closeSPI 一次.
其實不需要那麼麻煩,
開開關關 SPI 浪費時間,又可能造成不必要的問題
用 runonce 去包住程式即可
if(runonce){
p = frame_buffer;
  delay(100);
  readFrame();
  delay(200);
  sendLeptonFrame();
}
3#
發表於 2018-8-15 20:30:36 | 只看該作者
本帖最後由 超新手 於 2018-8-15 20:46 編輯

另外,因為你使用了 readstringuntil
所以請確定在輸入 C(或 O)之後
一定要按下 enter 鍵
而不是按下傳送
否則程式是會卡住不動的
4#
 樓主| 發表於 2018-8-16 09:59:03 | 只看該作者
本帖最後由 modico 於 2018-8-16 10:35 編輯

謝謝,照你的方式修改後,仍出現一樣的問題...

我檢查了兩個不同的CODE 發現差異就在宣告那邊一行而已..
不知道為什麼多宣告一個
String cmd = "";
讀出來的數據就會是錯的...把那一行砍掉就又恢復了
後來改成其他變數就解決問題了
5#
發表於 2018-8-16 10:36:20 | 只看該作者
你是怎麼改的?
6#
 樓主| 發表於 2018-8-16 10:55:27 | 只看該作者

不太明白你問的是甚麼耶?

這是我修改後,成功的code
String userAction="";
boolean runonce = false;
String cmd = "";  ←加入這一行就會出現不正確的值

void setup()
{
  Serial.begin(250000);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  openSPI();
}

void loop()
{   

    if(runonce){
      p = frame_buffer;
      delay(100);
      readFrame();
      delay(200);
      sendLeptonFrame();
    }

    if (Serial.available() > 0){
      userAction = Serial.readStringUntil('\n');
            if(userAction == "O"){
          runonce = true;
          userAction = "";
        }
        else if(userAction == "C"){
          runonce = false;
          userAction = "";
        }
    }

   /*closeSPI();
   delay(10);
   openSPI();*/

}
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-12-4 01:35 , Processed in 0.356078 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表