実現したいこと
Arudino nanoのLED点灯や出力をPCから制御したいです。
発生している問題・分からないこと
Arduino nanoのLED D13が点灯しないです。
Arudino IDEのシリアルモニタからメッセージを送ると、ちゃんと点灯するので、Arduino側には問題がないと思われます。
PC側のソースも、エラーを吐かないのでどこが悪いのか見当がつきません。
該当のソースコード
Arduino
1const int LED = 13; 2int incomingByte = 0; // for incoming serial data 3 4void setup() { 5 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps 6 pinMode(LED,OUTPUT); 7 digitalWrite(LED,LOW); 8} 9 10void loop() { 11 12 // send data only when you receive data: 13 if (Serial.available() > 0) { 14 incomingByte = Serial.read(); 15 if(incomingByte != 0){ 16 digitalWrite(LED,HIGH); 17 } 18 } 19 20 delay(10); 21}
C++
1#include <windows.h> 2#include <stdio.h> 3#include <stdlib.h> 4 5HANDLE arduino; 6bool Ret; 7 8void main(void) { 9 BYTE data = 1; 10 //1.ポートをオープン 11 arduino = CreateFile(L"COM6", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 12 //2014/01/22追記 これでつながらない場合には"\\\\.\\COM7"とするとつながるかもしれません。 13 14 if (arduino == INVALID_HANDLE_VALUE) { 15 printf("PORT COULD NOT OPEN\n"); 16 system("PAUSE"); 17 exit(0); 18 } 19 //2.送受信バッファ初期化 20 Ret = SetupComm(arduino, 1024, 1024); 21 if (!Ret) { 22 printf("SET UP FAILED\n"); 23 CloseHandle(arduino); 24 system("PAUSE"); 25 exit(0); 26 } 27 Ret = PurgeComm(arduino, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); 28 if (!Ret) { 29 printf("CLEAR FAILED\n"); 30 CloseHandle(arduino); 31 exit(0); 32 } 33 //3.基本通信条件の設定 34 DCB dcb; 35 GetCommState(arduino, &dcb); 36 dcb.DCBlength = sizeof(DCB); 37 dcb.BaudRate = 9600; 38 dcb.fBinary = TRUE; 39 dcb.ByteSize = 8; 40 dcb.fParity = NOPARITY; 41 dcb.StopBits = ONESTOPBIT; 42 43 Ret = SetCommState(arduino, &dcb); 44 if (!Ret) { 45 printf("SetCommState FAILED\n"); 46 CloseHandle(arduino); 47 system("PAUSE"); 48 exit(0); 49 } 50 //4.送信 51 DWORD dwSendSize; 52 DWORD dwErrorMask; 53 54 Ret = WriteFile(arduino, &data, sizeof(data), &dwSendSize, NULL); 55 if (!Ret) { 56 printf("SEND FAILED\n"); 57 CloseHandle(arduino); 58 system("PAUSE"); 59 exit(0); 60 } 61 printf("FINISH\n"); 62 CloseHandle(arduino); 63 system("PAUSE"); 64}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
色々と試行錯誤をしてみたところ、
OLEDモジュールをつけて、受信した文字を表示するようにしてみました。
これもシリアルモニタからだと正常に表示されました。
Arduino側のif (Serial.available() > 0) {}
の中に入ったら無条件で表示するようにしてみたのですが、
PCからの送信を全くバッファしていないらしく、送ったdataを表示しませんでした。
同じ個所に、OLEDモジュールとは別に、無条件でLED D13を点灯するようにしてみたところ、
やはり、シリアルモニタからなら点灯しますが、
PC側からだと点灯しません(正確には一瞬ついて消える)。
Aruduino側のloop() {}
にLEDを消すような文はないので、一瞬点灯しても関係がないと思われます。
実際には、D2、D3、D4を選択的にオンにするプログラムを書いたのですが、シリアルモニタからは正常動作するものの、PCからは全くオンになりません。
補足
Arduino IDE 2.3.2
Visual Studio Community 2022 (64 ビット) - Current Version 17.9.5

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/04/09 02:00