2013年6月9日日曜日

System::String^ から LPCTSTRへの変換

System::String^ から LPCTSTRへの変換
 Windowsフォームアプリケーションの作成時にTextBoxから得られるTextの型はSystemString^となっている.そいつをLPCTSTRに変換しなければいけない場合がある.(CreateFile関数を使用したい場合など)そんな時のためのメモ.


 #include <msclr\marshal.h>
 using namespace msclr::interop;
 ...
 System::String^ str = TextBox1->Text;
 marshal_context context;
 LPCTSTR lpcstr = context.marshal_as<const TCHAR*>(str);

参考

2013年6月8日土曜日

C言語でArduinoとシリアル通信してLEDを制御する

こんにちは。
C言語でArduinoとシリアル通信して制御する必要に駆られたのでサンプルプログラムを書いてみました。

まずはArduino側のプログラム

const int LED = 12;
int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
        pinMode(LED,OUTPUT);
        digitalWrite(LED,LOW);
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                incomingByte = Serial.read();
                if(incomingByte == 1){
                  digitalWrite(LED,HIGH);
                }
        }
     
        delay(10);
}

Arduino側のプログラムではC言語のプログラムから送信されてきた数字を受信し、それがもし1であったらLEDを発光、そうでなかったら何もしない。

それに対してC言語側のプログラム

#include <windows .h>
#include <stdio .h>
#include <stdlib .h>

HANDLE arduino;
bool Ret;

void main(void){
 BYTE data = 1;
 //1.ポートをオープン
 arduino = CreateFile("COM7",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 //2014/01/22追記 これでつながらない場合には"\\\\.\\COM7"とするとつながるかもしれません。

 if(arduino == INVALID_HANDLE_VALUE){
  printf("PORT COULD NOT OPEN\n");
  system("PAUSE");
  exit(0);
 }
 //2.送受信バッファ初期化
 Ret = SetupComm(arduino,1024,1024);
 if(!Ret){
  printf("SET UP FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 Ret = PurgeComm(arduino,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
 if(!Ret){
  printf("CLEAR FAILED\n");
  CloseHandle(arduino);
  exit(0);
 }
 //3.基本通信条件の設定
 DCB dcb;
 GetCommState(arduino,&dcb);
 dcb.DCBlength = sizeof(DCB);
 dcb.BaudRate = 9600;
 dcb.fBinary = TRUE;
 dcb.ByteSize = 8;
 dcb.fParity =NOPARITY;
 dcb.StopBits = ONESTOPBIT;

 Ret = SetCommState(arduino,&dcb);
 if(!Ret){
  printf("SetCommState FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 //4.送信
 DWORD dwSendSize;
 DWORD dwErrorMask;
 
 Ret = WriteFile(arduino,&data,sizeof(data),&dwSendSize,NULL);
 if(!Ret){
  printf("SEND FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 printf("FINISH\n");
 CloseHandle(arduino);
 system("PAUSE");
}

C言語側のプログラムでdataの値を1でなくするとプログラム実行時にLEDが発光しなくなることを確認することができました。
したがって、dataの値を指令値としてサーボモータの制御等に利用することができます。
ではまた!

参考にしたサイト

追記 2014/12/04 18:40
ArduinoからPCへデータを送信するC言語のプログラムはhttp://monitorgazer.blogspot.jp/2014/12/visualstudioarduinowin32cc.html
に書きました。