2016年6月11日土曜日

SmartLaser用のアプリを0から開発する。その3

SmartLaserCO2というのを研究開発目的で購入、
ソフトウェアの研究開発を開始です。
さて、codeを書いてみます。
ちょっと書きっぱなしな感じなのですが、テストとしてはこんな感じです。
起動して移動させてそれからリセット(HOMEへの移動)をさせてますが、
たぶん、このままではうまく動かないです。
タイミングをうまくとらないと、ダメですね。
ここらへんは、SleepやらRecieveのバイト数やら、いろいろやることになります。
実際にはデバッガでところどころ止めながらやってみたので、うまく動作したですね。

謎の文字列はどっから引っ張ってきたかというと、実際に元々のソフトウエァを動かして、
SerialPortMonitorなるものでキャップったからですね(o^^o)

int aCom::test01(void){
 HANDLE cPort = ::CreateFileA("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
 DCB dcb;     // シリアルポート構成情報STRUCT
 ::GetCommState(cPort, &dcb);// 現在の設定値をGET
/*
 dcb.BaudRate  = 57600;  // 速度
 dcb.ByteSize  = 8;   // データ長
 dcb.Parity   = NOPARITY;  // パリティ
 dcb.StopBits  = ONESTOPBIT; // ストップビット長
 dcb.fOutxCtsFlow = 0;   // 送信時CTSフロー
 dcb.fRtsControl  = RTS_CONTROL_ENABLE; // RTSフロー
*/
 ::SetCommState(cPort, &dcb); // 取得したまま書き込む。こうしないと、データが戻らない?

 unsigned long errors = 0;
 COMSTAT comStat;
 ::ClearCommError(cPort, &errors, &comStat);
 int lenR = comStat.cbInQue; // 受信したメッセージ長を取得する

 for(int w=0;w<20;w++){
  if(lenR) break;
  ::Sleep(500);
  ::ClearCommError(cPort, &errors, &comStat);
  lenR = comStat.cbInQue;
 }
 if(!lenR){
  // Error
  printf("error-01\n");
//  return 0;
 }
 if(lenR > 100){
  // Error
  printf("error-02\n");
//  return 0;
 }
 char rBuf[10000];
 memset(rBuf,0,sizeof(rBuf));
 unsigned long nPut = 0;
 unsigned long nRead = 0;
 ::ReadFile(cPort, rBuf, lenR, &nPut, 0); // バッファからREAD
 // テスト環境では、【# LasaurGrbl 14.01\x0a】
 if(!strstr(rBuf,"LasaurGrbl")){
  // Error
  printf("error-03\n");
//  return 0;
 }else{
  printf("LasaurGrbl OK!\n");
 }

 ::WriteFile(cPort, "\x14", 1, &nPut, 0); // ポートへPUT
 memset(rBuf,0,sizeof(rBuf));

 ::ReadFile(cPort, rBuf, 10, &nRead, 0);  // バッファからREAD

 // 謎の文字列送信
 ::WriteFile(cPort, "\x5e\x9f\x3f\x0a\x2a\x9f\x3f\x0a", 8, &nPut, 0);
 memset(rBuf,0,sizeof(rBuf));

 ::ReadFile(cPort, rBuf, 100, &nRead, 0); // バッファからREAD

//::Sleep(2000);




 ::WriteFile(cPort, "G90\x0aM80\x0aG0F8000\x0aG1F1500\x0aS77\x0a", 28, &nPut, 0);
 memset(rBuf,0,sizeof(rBuf));
 ::ReadFile(cPort, rBuf, 100, &nRead, 0); // バッファからREAD



 // 移動させてみる。
 ::WriteFile(cPort, "G0X150.0Y150.0\x0a", 15, &nPut, 0);
 memset(rBuf,0,sizeof(rBuf));
 ::ReadFile(cPort, rBuf, 100, &nRead, 0); // バッファからREAD

 // レーザーさせてみる。
 ::WriteFile(cPort, "G1X130.0Y130.0\x0a", 15, &nPut, 0);
 memset(rBuf,0,sizeof(rBuf));
 ::ReadFile(cPort, rBuf, 100, &nRead, 0); // バッファからREAD


 // 戻す
 ::WriteFile(cPort, "M81\x0aS0\x0aG0X0Y0F8000\x0a", 19, &nPut, 0);
 memset(rBuf,0,sizeof(rBuf));
 ::ReadFile(cPort, rBuf, 100, &nRead, 0); // バッファからREAD





//::Sleep(2000);

 // 謎の文字列送信原点の移動?
 ::WriteFile(cPort, "\x21\x0a", 2, &nPut, 0);
 ::WriteFile(cPort, "\x5e\x80\x7e\x0a\x2a\x80\x7e\x0a\x5e\x95\x47\x33\x30\x0a\x2a\x95\x47\x33\x30\x0a", 20, &nPut, 0);

 memset(rBuf,0,sizeof(rBuf));

 nRead = 0;
 while(nRead == 0)
 ::ReadFile(cPort, rBuf, 100, &nRead, 0); // バッファからREAD

 printf("%s\n",rBuf);
 ::CloseHandle(cPort); // シリアルポートを閉じる
 return 0;
}

0 件のコメント:

コメントを投稿