ソフトウェアの研究開発を開始です。
さて、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 件のコメント:
コメントを投稿