Visualstudio 2013 を使用して C# で開発を行っています。 SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、 非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。 5Byteのデータは正常に取得できるのですが、 その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。 serialPort.DataReceived に登録したイベント関数の中身です。 -------------------------------------------------------------------------------------- private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { bytesRead = 0; // Initialize a buffer to hold the received data byte[] buffer = new byte[this.serialPort.ReadBufferSize]; try { bytesRead = this.serialPort.Read(buffer, 0, buffer.Length); if (true == serialPort.IsOpen) { serialPort.DiscardInBuffer();//受信バッファをクリアする } } catch (Exception ex) { DataLog.Exception(ex); } //派生クラス用の処理 DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead); DeviceClassEvent(this, _DeviceClassEventArgs); } -------------------------------------------------------------------------------------- ネットの情報を参考に、 ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで とりあえず正常に取ることが出来たのですが、これでいいのでしょうか? 期待するデータ量がわからなかった場合は使えないのかなとも思います。 データが欠損してしまう理由、 上記の対処法以外の一般的な対処法など有りましたら教えて下さい。 その他参考になるページ等ありましたら教えていただけると大変助かります。
↧
C# シリアル通信でデータ受信時の欠損について
↧
初回のスピンボタンの挙動
下記コードを記入し、スピンボタンの増加をクリックすると 最初の一回目に触った時のみ値がマイナスされる現象がでます。 なぜでしょうか? 1)INIファイルから値を読み込みエデットボックスに表示する。 2)スピンボタンの増加をクリックすると、最初の一回目に触った時のみ値がマイナスされる (エデットボックスの値が50だとすると49になる) 3)再度INIファイルから値を読み込みエデットボックスに表示する。 4)二回目からマイナスされない。 (エデットボックスの値が50だとすると51になる) スピンボタンのOnDeltapos UDACCEL stUD; stUD.nSec = 1; stUD.nInc = 1; // ここで変化量設定 CSpinButtonCtrl* m_Spin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1); m_Spin->SetRange32(0,300); //レンジ CString str; ((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(str);//エディットから文字列を int a=atoi(str);//文字列を数字に変換 m_Spin->SetPos(a); //初期値 m_Spin->SetAccel(1,&stUD);//変化量 m_Spin->SetBuddy((CSpinButtonCtrl*)GetDlgItem(IDC_EDIT1));//エディットに関連付け 環境 Windwos XP,Microsoft Visual C++ 6.0
↧
↧
文字列の連結するプログラム
独学でプログラミングをやっているんですが2つ文字列を1つにする方法がよくわかりません。(1)のプログラムは(b+3)のところは文字の長さを指定しているからだめで(2)はstrcpyやstrcatなどのコマンドを使わずにやるそうです。While分とかでやるんでしょうか?教えてください。 (1) #include <stdio.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; int a,b; spel[6]=0; for(a=0;spel[a]!=0;a++){ spelC[i] = spelA[i]; }; for(b=0;spelB[b]!=0;b++){ spelC[b+3] = spelB[b]; }; printf("%s\n",spelC); return(0); }; (2) #include <stdio.h> #include <string.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; strcpy(spelC,spelA); strcat(spelC,spelB); printf("%s\n",spelC); return(0); }
↧
1つのプロジェクトで32/64bit両対応する
VisualStudio2008でアプリケーションを開発していますが、 WindowsXP(32bit)と、Windows7以降(64bit)の両方の環境で動作させる必要があります。 ソースコードは共通で、別会社から提供されているlibのみ32bit/64bitの切り替えが必要になります。 このような場合、1つのプロジェクトで何かの設定を少し変更するだけで32bit/64bitを切り替えるということは可能でしょうか。 ※VisualStudioですと、Debug/Releaseモードによってlibファイルのビルドの有無を設定できますが、そのようなイメージです。
↧
[c++] <pthread.h>がinclude できない
Visual C++ 2008 Express Edition Windows XP Professional SP3 以下のコードがコンパイルできない ーーー #include <pthread.h> ーーー エラー内容 include ファイルを開けません。'pthread.h': No such file or directory LIBをインストールしたりする必要がありますか?
↧
↧
コメント行を検索対象から除外する方法
C/C++のソースコードを普通にテキスト検索やGREPを実行すると、当然コメントも検索結果に表示されます。コメント部分が検索結果に表示されないようにする手段やツールはあるでしょうか?つまり、"//"以降改行文字までと"/* */"に囲まれたコードを検索対象から除外するということです。#if 0 ~ #endifも適切に解釈して除外してくれるとより助かります。 Visual Studioのテキストエディタで実現出来れば一番都合が良いのですが、それらしいオプションが見当たりません。 秀丸エディタのGREPのオプションに「追加の条件」の設定があり、ここでコメントを除く指定をすればコメント行が検索対象から除外されます。ただ、この方法だと通常の検索の何倍もの時間がかかってしまい非現実的です。恐らく全ての文字をコメント文字かどうか判定しているのでしょう。 検索対象のソースは2万ファイルに上り、100万行を超えています。10文字の検索文字列で、普通に全ソースGREPすると25秒程度、コメントを除くオプション指定だと315秒(5分以上)かかりました。もちろん検索文字の長さやその他オプションにも依存するでしょうが、さすがに普段使いとしては現実的ではない所要時間です。 除外したいコメント行はたいてい行頭にコメント文字"//"がありますので、行頭の"//"のチェックに限定したいです。ただ空白スキップくらいはあると良いです。これにより現実的な検索時間に収まるかどうかはやってみないと分かりませんが・・ なお、検索結果からコメント行を削除する秀丸のマクロはありました。ただ、この方法ではコメント行も検索対象となるため、余分な検索時間がかかっていますし、何しろ二度手間です。普段のソース検索でコメント行も含む検索はあまり行わないと思います。 なぜこれが問題になるかと言いますと、ソースに修正前のコードをコメントとして残してあるため、コメント行が膨大になっているのです。Javaの標準ライブラリほどではありませんが、ざっと調べたところソースの40%はコメント行です。 同一箇所の複数の変更履歴が全部コメントとして残っているため、実質1か所のヒットでも検索結果に2つも3つも重複して表示されてしまいます。もちろん、このように修正履歴をコメントとして残すこと自体が問題なのは分かっていますが、自前のソースではないので手を出せないのです。
↧
[C++/CLI]可変個引数について
visual studio 2005を使用し、C++で作ったクラスをVBで呼び出せるようにするため、C++でラッパクラスを作成中です。 ネイティブコードで可変個の引数を表すには、 Test(PSTR str, ...){ charch[1024]; va_listap; va_start(ap, str); wvsprintf( ch, str, ap ); va_end(ap); ・ ・ ・ } のようにすればOKだったのですが、マネージコードで可変個の引数を使用するにはどうすれば良いのでしょうか。「ParamArray」というキーワードを使うのでしょうか? また、ラッパクラスではないクラスの可変個引数を使用しているメソッドで、 「warning C4793: 'vararg' : 関数 'DWORD CTest::Log(PSTR,...)' 用にネイティブ コードの生成が発生します」 というワーニングがでています。これは無視しても大丈夫なのでしょうか? 申し訳ございませんが、分かる方がいましたら回答をお願いします。
↧
文の改行
C++である行の文が長くなったので、改行して次の行に文を書きたいのですが、どうすればいいのでしょうか? ご教授お願いします。
↧
StringGridでの文字入力制限
C++BuilderでStringGridで、GoEditingプロパティをtrueに設定してセルの内容を編集するときに、数字のみ受付可能にするにはどうしたらいいでしょうか?よろしくお願いします。
↧
↧
visual studioの不要なDll削除方法
お世話になります visual studio 2010で教えていただきたいのですが 前任者から引き継いだ段階で、既に未使用のDLLがあり、 これを削除したいのですが、方法を教えていただけないでしょうか。 下記2か所で表示されるXXX.dllを削除したいのです (1)プロジェクトのプロパティ⇒構成プロパティ⇒C++⇒コマンドライン 「/FU"C:\・・・\XXX.dll"」 ※クリックでカーソルは表示&移動できるのですが、削除&編集ができません。 ここは、表示だけで、どこかに編集するところが有るのでしょうか? (2)ソリューションエクスフローラ⇒Setup⇒見つかった依存関係 「XXX.dll」 ※右クリックでメニューが表示されますが、「削除」の項目が無く、現在は「除外」を選択しています。
↧
C言語 ツェラーの公式を使った曜日の計算
ツェラーの公式を使い、年、月、日にちから曜日を表示するプログラムを作りました。 #include<stdio.h> main() { int y,m,d,x,z; printf("年、月、日にちの順に入力してください→"); scanf("%d%d%d",&y,&m,&d); if(m<2){ m=m+12; y=y-1; } x=y+y/4-y/100+y/400+(13*m+8)/5+d; z=x%7; switch(z){ case 0: printf("日曜日\n"); break; case 1: printf("月曜日\n"); break; case 2: printf("火曜日\n"); break; case 3: printf("水曜日\n"); break; case 4: printf("木曜日\n"); break; case 5: printf("金曜日\n"); break; case 6: printf("土曜日\n"); break; } } これを基本に、1582年10月5日以前の入力があったとき「エラー」と表示するにはどうすればいいですか? 解答お願いします。
↧
ダイアログを自分の好きな位置に表示したい
VCで簡単なプログラムを造っています。 ダイアログベースです。 EXE を実行した時に表示されるダイアログを、自分の指定した位置に 表示させる方法はあるでしょうか。 また、そのダイアログから DoModal関数で別のダイアログを表示する場合、 同様に、自分の指定した位置に表示させる方法はあるでしょうか。 デフォルトのままだと、1つ目のダイアログは画面の中央に、 DoModal関数で表示させたダイアログは、1つ目のダイアログの上に なります。
↧
C# メッセージボックスのOKボタンを自動クリック
C#のwebBrowserでメッセージボックス(OKとかキャンセルとかのボタンがついたフォーム)のOKボタンを自動で押したいです。 メッセージボックスはhtmlのjavascriptで発生しており、何をどうすれば良いか分かりません。 拙い説明で伝わったのかどうか不安ですが、ご教授下さい。
↧
↧
プログラミング
現在、lpc解析して求めたフォルマント周波数を使って話者認証を行いたいのですが、そのフォルマント周波数を使って個人を自動的に誰の声かを判別するC++をつかったプログラミングが思いつきません。 プログラミングに詳しい方、何かアドバイスが欲しいです。
↧
C言語でヒストグラムを作成するプログラムを作りたいのですが
C言語でヒストグラムを作成するプログラムを書いたのですが、正しい濃度値が出力されずに困っています。 ヘッダなしの2バイト画像データを読み込みヒストグラムを書き出すプログラムです。 gccを使っています。 よろしくお願いします。
↧
ガウスの消去法のプログラムについて
ガウスの消去法のプログラムについて #include <stdio.h> #define N 3 void main(void) { static double a[N][N+1]={{3.0, 1.0, 1.0, 8.0}, {6.0, 2.0, 3.0, 4.0}, {9.0, 4.0, 5.0, 12.0}}; double d; int i,j,k; for (k=0;k<N-1;k++){ for (i=k+1;i<N;i++){ d=a[i][k]/a[k][k]; for (j=k+1;j<=N;j++) a[i][j]=a[i][j]-a[k][j]*d; } } for (i=N-1;i>=0;i++){ d=a[i][N]; for (j=i+1;j<N;j++){ d=d-a[i][j]*a[j][N]; a[i][N]=d/a[i][i]; } } for (k=0;k<N;k++){ printf("x%d=%f\n",k+1,a[k][N]); } } というプログラムを実行したら 8-5.c: In function `main': 8-5.c:4: warning: return type of `main' is not `int' と出たのですがどこを直せばよいのでしょうか?><
↧
6点からの楕円の近似計算(最小二乗法、xyz次元)
みなさん、こんにちわ。 楕円についてプログラムしないといけなく、わからない点が多いので質問させてください。 ある6点(座標はxyz)からxyz楕円の最小二乗法をプログラムすることは可能でしょうか?この掲示板の「楕円のプログラム」を参考にするとある5点以上の測定点からxy座標(2次元)のグラフにすることは可能であると書いてあり、納得しました。 分からない点はxyzの楕円の基本方程式です。 なお、使用する環境はc言語です。参考になるサイトなどありましたら教えてください。
↧
↧
OpenCVによる面積算出
OpenCVによる面積算出 現在OpenCVを使用して、2値化した画像を取得し保存。そして取得した画像を読み込み白い部分の面積を求めるプログラムを作成中なのですが、正直分かりません;; どのように作ればいいのか、OpenCvのプログラミングブックやGoogleで検索しても、自分で作成するに至れない状況です。もしよろしければ、アドバイス等をいただけると幸いです;;
↧
リッチエディットのやり方が解りません
リッチエディットのやり方が解りません 相談するのは2回目です。今回は書籍『猫でもわかるWindowsプログラミング』について不明な点があるので、相談に伺いしました。当方の環境はBCC Developerなのですが、第14章のデスクトップアクセサリのプログラムをすべて打ち込んだのに実行できないのです。エラーメッセージと該当箇所は以下の通りです。 (1)エラーメッセージ Error desktop01t.rc 52 27: Expecting control window style ** error 20018 ** deleting Debug\desktop01t.res (2)該当箇所(リソース) 38|MYDLG DIALOGEX 0, 0, 131, 218 39|STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | 40| WS_POPUP | WS_CAPTION | WS_SYSMENU 41|CAPTION "予定表" 42|FONT 9, "MS ゴシック", 400, 0//, 0x80 43|BEGIN 44| EDITTEXT IDC_EDIT1,7,121,117,14,ES_AUTOHSCROLL 45| EDITTEXT IDC_EDIT2,7,135,117,14,ES_AUTOHSCROLL 46| EDITTEXT IDC_EDIT3,7,149,117,14,ES_AUTOHSCROLL 47| EDITTEXT IDC_EDIT4,7,163,117,14,ES_AUTOHSCROLL 48| EDITTEXT IDC_EDIT5,7,177,117,14,ES_AUTOHSCROLL 49| DEFPUSHBUTTON "記入",IDOK,7,197,50,14 50| PUSHBUTTON "閉じる",IDCANCEL,74,197,50,14 51| CONTROL "",IDC_MONTHCALENDER1, 52| "SysMonthCal32",MCS_NOTODAY | 53| MCS_NOTODAYCIRCLE | WS_TABSTOP,7,7,117,89 54| LTEXT "",IDC_MYSTATIC,7,103,83,11 55| PUSHBUTTON "本日",IDC_TODAY,98,100,26,19 56|END 情報を漁ってみて<a href="http://questionbox.jp.msn.com/qa5414346.html ">richedit.hを追加すべきという情報</a>を見つけたのでプログラムの方で、 #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" としたのですがエラー内容は変わりません。そもそもBCC Developerではライブラリファイルしかリンクできないので、必要とされるriched32.dllを手動で無い方法でプログラムに取り込む方法が解らないのです。手動であればサイトの方の<a href="http://www.kumei.ne.jp/c_lang/sdk2/sdk_122.htm">「猫でも」の第122章</a>が該当するようですが、riched32.dllは提供されているダイナミックリンクライブラリなので方法があると思うのです。どうか取り込み方のご教授をお願いいたします。なおライブラリファイルしかリンクできないと思ったので、当初はriched20.libをリンクしてエラーを出しておりました。
↧
DWORDの実際の型は何でしょうか
VC++.NETの環境です。 DOWRD dw1 = 1; int i = 2; と定義し ここで if ( i > dw1 ){ 何かの処理; } とコーディングすると warning C4018: '>' : signed と unsigned の数値を比較しようとしました。 のワーニングがでます。 これは、DWORDがint型でなくunsigned int型のようにも見えます。 ある本によれば(VC++.V.NET逆引き大全500の極意) DWORD はint型であると記述されています。 もし、int型ならこのワーニングはでないはずなのですが、 なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。
↧