2013-11-01 55 views
3

我想知道是否有一種標準方式與串行設備進行通信是有效的。我應該使用標準庫嗎?如果是這樣,哪一個?C++ Linux(Ubuntu)正確寫入串行(對於Arduino)

現在我正在擺弄一個基於數字輸入的給定數量的LED點亮。 (下面的Arduino代碼)。只是練習的東西。

看我過於簡單,低效的測試:

#include <iostream> 
#include <stdio.h> 
using namespace std; 

int 
main() 
{ 
    FILE *file; 
    //Opening device file 

    int getnum; 

    while (true) 
    { 
     file = fopen("/dev/ttyACM5", "w"); 
     cout << ">>" << endl; 
     cin >> getnum; 
     fprintf(file, "%d", getnum); //Writing to the file 
     fclose(file); 
    } 

} 

如果允許無需等待用戶運行while循環很可愛,但幾乎沒有有效的。我懷疑多餘的fopenfclose使用是愚蠢的。

微控制器將會感測設備的狀態並向計算機發送信號。計算機將對所有這些值進行「搗碎」,併發送消息來改變arduino的行爲。基本上,沉重的想法是委託給計算機,除了需要人類的鍵盤輸入。

當然這都是爲了好玩,但正如你所看到的,我需要在C++中「學習串行交互的規則」! 任何幫助或指導極大的讚賞。


Arduino的代碼:

char incomingByte = 0; // for incoming serial data 
int led = 11; 
int bright; 
void 
setup() 
{ 
    Serial.begin(9600);  // opens serial port, sets data rate to 9600 bps 

} 

void 
loop() 
{ 

    // send data only when you receive data: 
    if (Serial.available() > 0) 
    { 
     // read the incoming byte: 
     incomingByte = Serial.read(); 

     switch (incomingByte) 
     { 
     case '1': 
     bright = 10; 
     break; 
     case '2': 
     bright = 50; 
     break; 
     case '3': 
     bright = 255; 
     break; 

     default: 
     bright = 0; 
     break; 
     } 

     analogWrite(led, bright); 

     Serial.println(incomingByte); 
    } 
} 
+0

請讓我知道,如果我的問題缺乏任何方式。 – Orangeman555

+0

這個問題的贊成數量很少讓我感到困惑。我希望我能給你多一個,我處於和你一樣的情況。 – gromit190

+0

查看[ŧhis答案](http://stackoverflow.com/a/34799431/841108)到一個非常類似的問題 –

回答

2

我不知道爲什麼沒有人回答了這麼久這個問題。你爲什麼說這是一種低效率的方式?如果你指的是文件系統,它不會創建一個物理文件。這實際上是正確的方式,只是不要打開和關閉循環內的文件描述符。如果您想讓Serial.read讀取單個值,請發送'\n', fprint (file, "%d\n", value)

+0

非常感謝。我想知道它是否反覆執行寫操作。 – Orangeman555