2011-11-22 76 views
0

我想創建一個程序,用戶輸入一個字符串,它可以編碼爲一條消息並通過USB發送給我的Arduino板,它接收消息並將其顯示在液晶屏。我有Arduino的一切,但工作:但我可以通過Arduino IDE中的串行監視器發送一個字符串(完整的標誌值來標記開始和結束)。通過C++與Arduino交流

我現在的問題是創建程序來驅動它。我從來沒有試圖通過C++連接到串行連接。今天下午我一直在看幾個不同的實現,但是我很難在它們之間進行排序,至少對我而言,最容易使用。

我覺得我的需求相當溫和,因爲我基本上是用循環驅動的菜單系統創建一個控制檯應用程序,它會詢問用戶他們想要下一個字符串,然後將其編碼爲新的字符串併發送。

我見過一些涉及在CLR C++中使用SerialPort類/庫的不同職位,但我沒有CLR C++的經驗,而且看起來有些不同。對於那些擁有體面的本地C++知識(我剛剛完成我的第二個關於數據結構和OOP的C++類,這是該項目的實際用途)的人來說,要快速轉移到CLR C++似乎特別困難,或者有更好的方法替代在那裏?

我能找到的最好的就是在這個頁面上:http://arduino.cc/playground/Interfacing/CPPWindows,但是,當我嘗試將頭文件和CPP文件添加到Visual Studio中的本機項目時,編譯時出現錯誤:error C2664: 'CreateFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'。有誰知道我是否可以在該類型的項目中使用它?

感謝您的幫助!我只是很困惑該從哪裏着手這個項目。

+2

我認爲自從您提到CLR以來您就一直在談論Windows,但如果這不是您所指定的操作系統,請隨時重新提出您的問題。 –

+0

你是對的,我的意思是Windows。 – Devin

回答

1

我認爲CLR是沒有必要的。您提供的樣本類應該足夠了,您指出的問題可以通過投射來解決,例如,

this->hSerial = CreateFileA(static_cast<LPCSTR>(portName), 
      GENERIC_READ | GENERIC_WRITE, 
      0, 
      NULL, 
      OPEN_EXISTING, 
      FILE_ATTRIBUTE_NORMAL, 
      NULL); 

有兩個修改:改變宏的CreateFile起作用CreateFileA的,並且所述的static_cast第一個參數。如果仍然存在問題,請嘗試添加一些更具體的問題。

+0

謝謝,您的修復工作就像一個魅力!我想知道他們是否需要在Ardunio頁面上反映出來(或者由於某種原因,它只是針對我的設置)。如果你不介意,CreateFile和CreateFileA有什麼區別?也許「A」是一個異步版本?只是爲了我自己的好奇心......謝謝! – Devin

+0

@Devin:我認爲,不需要將這些更改發送到Arduino頁面。它們取決於所使用的項目設置和編譯器。 CreateFile是一個宏,根據unicode設置屏蔽實際函數名稱。一般來說,如果UNICODE定義爲使用W()函數,其中> W代表「寬」,因爲單個字符可以比一個字節「更寬」。否則,如果沒有定義unicode,則使用 A()函數(其中> A代表ANSI),其中單個字符只能是一個字節寬。無論您要使用哪種功能,您都必須以正確的格式提供字符串參數。 – baderman

+0

@Devin: 關於函數的更多信息可以在這裏找到:[link](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx) – baderman