実現したいこと
Arudino nanoのLED点灯や出力をPCから制御したいです。
発生している問題・分からないこと
Arduino nanoのLED D13が点灯しないです。
Arudino IDEのシリアルモニタからメッセージを送ると、ちゃんと点灯するので、Arduino側には問題がないと思われます。
PC側のソースも、エラーを吐かないのでどこが悪いのか見当がつきません。
該当のソースコード
Arduino
1const int LED = 13;2int incomingByte = 0; // for incoming serial data3 4void setup() {5 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps6 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}
試したこと・調べたこと
上記の詳細・結果
色々と試行錯誤をしてみたところ、
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
0 コメント