• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:RS232Cの通信が出来ない。)

RS232C通信ができず、VC++初心者が詳しい方法を教えてください

nyasu_ncの回答

  • ベストアンサー
  • nyasu_nc
  • ベストアンサー率50% (12/24)
回答No.1

こんばんわ 載せてあるコードを見て、考えられる可能な限りを書いてみたいと思います。 (1)m_strCmdがNULLポインタの可能性あり void CMscCtrl:: WriteMsc(void) { //m_strCmdがNULLの場合、抜ける(設計者へ要確認) if( m_strCmd == NULL ) return; int n = strlen(m_strCmd);      ::: (2)未通過の処理あり ※下記の場合、nAxisが1,2以外の場合、何もSetしない ※これは仕様として正しいのでしょうか? swith(nAxis){ case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF); // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF); // Y軸原点復帰 } (3)そもそもswitch文が間違い? switch文には、break; を使う場合が多いです(使い分けます) 分からなければ、if,else,else ifで書いた方がよいかも XYステージというのを知りませんし、コードが短いため、 参考になるかどうか分かりませんが、可能性があるものをひとまず書いてみました。

kyotojun
質問者

お礼

nyasu_ncさん デバッグ中に突然動くようになりました。 あやしくまた新たな質問をすると思いますが、今後ともよろしくお願いいたします。 ありがとうございました。

kyotojun
質問者

補足

nyasu_ncさん ありがとうございます。 投稿間違いがありました、申し訳ありません。 case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF);break; // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF);break; // Y軸原点復帰 です。 case 1にブレークポイントを置き,nAxisとm_strCmd値を確認しました。 nAxis は、1です。 m_strCmd は、0x00430700 でした。 いかがでしょうか。

関連するQ&A

  • C言語でのRS232Cとの通信

    今後,電動ステージをRS232Cを持つコントローラとVisual studio2008で動かすことになったのですが, プログラム初心者のため,動かし方がわかりません. 一応,いくつかのサイトで調べた方法を試したのですが,動かすことができませんでした. 下に現在のプログラムソースを張ってあります. また,コントローラの諸元は, ボーレート:9600 データ長:8ビット ストップビット:1ビット パリティ:なし です. 皆さんのアドバイスを頂けたら,幸いです. また,このような質問は初めてなので,どういった情報がわかれば尚良いかを教えて頂けると幸いです. [プログラムソース] #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #define CR 0x0d #define LF 0x0a HANDLE hCom; void init(char *com, int baudrate); void m_move(double pos); int main() { double pos; init("COM1", 9600); printf("移動量 = ");scanf("%lf", &pos); m_move(pos); CloseHandle(hCom); } void init(char *com, int baudrate) { DCB dcb; hCom = CreateFile("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); GetCommState(hCom, &dcb); dcb.BaudRate = baudrate; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCom, &dcb); } void m_move(double pos) { int Send_Res, SendLen; char Send_Buf[4000]; char cmd[256]; DWORD wbyte; sprintf(cmd, "LMA ,,%.2lf", pos); //LMA はステージを動かすコマンド printf("%s", cmd); strcpy(Send_Buf, cmd); SendLen = strlen(Send_Buf); Send_Buf[SendLen] = CR; Send_Buf[SendLen + 1] = LF; Send_Res = WriteFile(hCom, Send_Buf, SendLen+2, &wbyte, NULL); fflush(stdout); Sleep(100); }

  • RS232cと通信が可能な、CまたはC++のプログラム

    初めて投稿します。 現在卒業研究で、RS232cで接続された2次元センサ(カメラで対象物をトラッキングし、2次元座標データをPCに送る計測器)のデータをPC(OSはXP)で読み込もうとしています。 以下のサイトを見つけ、 http://7ujm.net/C++/Rs232c.h.html ソースファイルとヘッダーファイルからなるプログラムをつくり(プログラムの変更点は最後に明記しました) 、VC++とBORLANDC++で試してみたのですが VC++ではプロジェクトのビルド時に 「fatal error C1010: プリコンパイル済みのヘッダーの検索中に予期しないEOFを検出しました。」 とエラーが出てしまいます。 _tmain()関数の引数を無記入にしてみてもエラーの内容は変わりません でした。 また、BORLANDC++ではコンパイル時に 「エラー E2268 RS232.cpp 11: 未定義の関数'printf'を呼び出した(関数 tmai())」 「エラー E2268 RS232.cpp 13: 未定義の関数'gethar'を呼び出した(関数 tmai())」 となってしまい、ヘッダーファイルのみをコンパイルしても 「エラー E2141 RS232c.h 10:宣言の構文エラー」 というエラーが生じてしまいます。 念のためこちらも http://okwave.jp/qa733184.html 参考に、BORLANDの設定(bcc32.cfg ファイルの確認など、最初の設定)も確認しましたが、独習Cなどの教本に載っているプログラムでは問題なく動作します。 なお計測機器のボーレートは115200bps、ターミネータはcr(キャリッジリターン)のみで(lf(ラインフィード)が入ってもかまわない)、送信コマンドはASCII文字となっています。 ハイパーターミナル、MATLABのM-fileでの通信は確認済みです。 もしこのような環境でRS232c通信が利用可能なC(またはC++)プログラムをご存知の方がいらっしゃれば、教えていただけないでしょうか? よろしくお願いします。 「ソースファイル」 #include "RS232c.h" //このヘッダーを取り込みます。 int _tmain() { RS232c rs; rs.Connect(); rs.Send("POS#?,,1 CR/LF");//文字列を送信 Send(送信文字列) char w[100]; rs.Read(w,100); //文字列の受信 Read(char配列,読み込む文字数) printf(w); getchar(); return 0; } 「ヘッダーファイル」 #ifndef _RS_232C_H_ #define _RS_232C_H_ #if _MSC_VER > 1000 #pragma once #endif #include <windows.h> <中略> bool RS232c::Connect(char* PortNmae="COM1", int BaudRate = 115200, int ByteSize = 8, int Parity = NOPARITY, int StopBits = ONESTOPBIT, int RTS = RTS_CONTROL_DISABLE, int DTR = DTR_CONTROL_DISABLE, int ReadTimeOut =700, int WriteTimeOut = 700 ) <中略> { RS232c::~RS232c(){ //ポートを閉じます CloseHandle(m_hComm); } #endif // _RS_232C_H_

  • RS-232C通信(その1)

    RS-232Cの通信が上手くいかず困っています。 ユニットはオムロンV600コントローラと三菱シリアルコミュニケーションユニットです。 コントローラ取説を参考にケーブルを製作しましたが自信がありません。 正誤について指摘ください。 <コントローラ取説記載> コントローラ側⇔上位機器 GR 1─シールド   FG SG 9──────SG SD 2──────RD RD 3──────SD RS 4─┐  ┌─RS CS 5─┘  └─CS <製作したケーブル> コントローラ側⇔通信ユニット(A1SJ71QC24N-R2) GR 1─シールド SG 9──────SG 5 SD 2──────RD 2 RD 3──────SD 3 RS 4─┐  ┌─RS 7 CS 5─┘  └─CS 8 ┌─DTR 4 └─DSR 6 接続なしCD 1 宜しくお願いいたします。 背景ですが、現在、設備にV600を設置しておりVBでのプログラムを使い通信しております。 今回、V600を増設する、PCを集約化するなどの理由により、PLCから通信することになったのです。 (過去もPLCから通信しようとしたのですが、出来なくてPCにしてしまいました) そこで困っているのは、A1SJ71で”オーバーラン・フレーミングエラー”が出てしまいます。 データの送り方、受け方が解らないのです。 やりたいのは、 ”アドレス”0010”にアスキーで”070119”を送信したい”です。 コマンドデータは、”WTA10010070119” WT:コマンド A:アスキー 1:ヘッドチャンネル 0100:アドレス 070119:データ 質問1:”CR”はどう付加(表記)すればいいのでしょうか。 プログラムは下記のとおりです。 転送指令 ├─┤├─┬──(MOV K2 D100) A1SJ71のCH2を指定しD100へ │    ├──(MOV K7 D101) データ長7ワード │    ├──($MOV "WTA10010070119" D104) 送信データをD104(CR必要ですがわからない) │    └──(SET M○○) データ転送セット │ 送信指令 ├─┤├────(G.OUTPUT UA D100 D104 M○□)UAは先頭アドレスがXA0から始まる 質問2:間違い教えてください。 以上、宜しくお願いいたします。 ごちゃごちゃして申し訳ありません。 もしかして、”無手順送信用ユーザー登録フレーム”のアドレス”B7H”・”157H”終了コード(CR/LF)の指定をすればいいのですか。 このバッファメモリの変更の仕方がわかりません‥。 バッファメモリの書き替えは、 ”TO”命令で出来そうです。 やってみて、問題がありましたら、(その2)にて質問させていただきます。 また、結果も記載します。

  • C言語 最も小さい数

    #include <stdio.h> #define NUMBER 5 int min_of(const int vc[ ], int no){ int i; int min=vc[0]; for(i=1;i<no;i++) if(vc[i]<min){ min=vc[i]; return(min); } } int main(void) {int a[NUMBER],i=0; for(;i<NUMBER;i++){ scanf("%d",&a[i]); } printf("%d",min_of(a,NUMBER)); return(0); } 最も小さい数を出すようにしたいのですがうまくいきません。 どこがおかしいのでしょうか? 教えてくださいm(_ _ )m

  • C言語の計算についての質問です.

    C言語の計算についての質問です. 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 というようなファイルを行ごとに読み込んで、列ごとの和を算出させたいと考えています. 以下のようなプログラムをテスト作成してみたのですが,『 b=1のときのa[1] + b=2のときのa[1] 』のような計算ができません. どのようなプログラムを作成すればこの問題が解決できるか教えてください. #include <stdio.h> #include <string.h> int main(void) { FILE *fp; int i, j, k, no, b; double a[12]; double c[3]; char buffer[1024]; for(i=1; i<=2; i++) { sprintf(buffer, "PIVdemo_00%d%d.txt", i/10, i%10); printf("%s \n", buffer); fp = fopen(buffer,"r"); for(b=1; b<=12; b++) { fscanf(fp, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &a[9], &a[10], &a[11], &a[12]); printf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf \n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[9], a[10], a[11], a[12]); } for(b=0; b<=2; b++){ c[3]=a[b] + a[b+1]; printf("%lf", c[3]); putchar('\n'); } fclose(fp); } return (0); }

  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。

  • C言語のプログラミングで困っています

    C言語を勉強しています。まだまだ初心者で分からないことだらけなのですが、今回はファイル入出力の部分が分からず苦戦しています。 『100個の実数が入った2つのテキストファイルから数値を読み込み、  絶対値を求めるなどの計算をする』プログラムを作成しているのですが、 コンパイルし実行すると強制終了してしまいます。 プログラムは、 void main(void) { FILE *fp; double c[50000];   double d[50000];   double e[50000]; int n = 0;   int m = 0;   int i = 0;   char fname[80];   char fname2[80]; printf("ファイル名 : ");    gets(fname); if((fp = fopen(fname, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&c[i])!=EOF){ printf("%3d : %3lf",++n,c[i]); printf("\n"); i++; } printf("\n"); i=0; n=0; printf("ファイル名 : ");    gets(fname2); if((fp = fopen(fname2, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&d[i])!=EOF){ printf("%3d : %3lf",++n,d[i]); printf("\n"); i++; } …(以下計算) のようになっています。 整数のデータで計算を行うと、正常に動くのですが…。 コンパイルしてもエラーが出ないので、どこが悪いのかわからず困っています。 どなたか教えていただけないでしょうか。お願いしますm(_ _)m

  • C言語で複数列のデータを1列のみ読み込みたい

    行m列の任意のデータの処理を行うプログラムで, 列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません. どのようなコードを書けばいいでしょうか? 自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分) EOFを使っているためか,行数のiには全データ数が入ってしまいます. void main (void) { FILE* fp; int i, j; i=0, j=0; char FilePath[500]; char Folder[100]; char File[50]; printf("Folder Name:"); scanf("%s",&Folder); printf("File Name:"); scanf("%s",&File); sprintf(FilePath,"%s/%s",Folder,File); if(( fp = fopen (FilePath,"r")) == NULL){ printf("cannot open '%s'\n", FilePath); exit(1); } //ここまではうまく動きます while (fscanf(fp, "%lf", &A[i][0]) != EOF{ i++; } while (fscanf(fp, "%lf", &A[0][j]) != EOF){ j++; } printf("A[%d][%d]", i, j); int n, m;              //n,mはこの後for文で使いたいので登場してもらいました printf("input 'n':"); scanf("%d", &n); printf("input 'm':"); scanf("%d", &m); }

  • C++のファイル分割でのエラーについて

    最近VC2008でC++の勉強を始めたのですが、ファイル分割でLNK2005エラーというのが発生し、解消できません。 インクルードガードは行ったのですが、どうしたらよいのか分かりません。 ソースコードはこんな感じです。 //main.cpp #include "sub.h" #include "res.h" bool main(){ calcx(m_x); calcy(m_y); } //res.h 共有変数の宣言 #ifndef __RES_H #define __RES_H int m_x; int m_y; #endif //sub.h 関数のプロトタイプ宣言を行う void calcx(); void calcy(); //sub.cpp 関数の定義を記述する #include "res.h" void calcx(int x){ m_x = x + 100; } void calcy(int y){ m_y = y + 200; } エラー: 1>Main.obj : error LNK2005: "int m_x" (?m_x@@3HA) は既に sub.obj で定義されています。 1>Main.obj : error LNK2005: "int m_y" (?m_y@@3HA) は既に sub.obj で定義されています。 上記のようなエラーを解消するにはどうしたら良いのでしょうか。 何がおかしいのか指摘をお願いします。

  • CからVB

    以下のプログラムはC言語で作成されています。 これをVBで作成したいです。 教えてください。 #include <stdio.h> #include <stdlib.h> double *alloc(int r,int n,int m); void input(double *p,int r,int n,int m); void sumup(double *p,int r,int n,int m); int main(void){ int r, n, m; double *p; // 行列サイズ入力 printf("input r n m "); scanf("%d %d %d",&r,&n,&m); // 行列領域取得 p = alloc(r,n,m); // 行列要素入力 input(p,r,n,m); // 行列の和 sumup(p,r,n,m); //終了,行列領域解放 free(p); return 0; } double *alloc(int r,int n,int m){ double *p; printf("MATRIX[r=%d][n=%d][m=%d]\n\n",r,n,m); p = (double*)malloc(sizeof(double)*r*n*m); if( p == NULL){ printf("error! malloc failed.\n"); exit(-1); } return p; } void input(double *p,int r, int n,int m) { int i,j,k; for(i = 0; i < r; i++){ for(j = 0;j < n; j++){ for(k = 0; k < m; k++){ printf("input MATRIX[%d][%d][%d]= ",i,j,k); scanf("%lf",&p[i*(n*m)+j*m+k]); } } } printf("\n"); } // 行列の和 void sumup(double *p,int r,int n,int m){ int i, j, k; // 0.0, not 0!!! double sum = 0.0; printf("sum of %d matrices:\n",r); for(j = 0; j< n; j++){ for(k = 0;k < m; k++){ sum=0; for(i = 0;i < r;i++){ sum += p[i*(n*m)+j*m+k]; } printf("\n%2f",sum); } } printf("\n"); }