スポンサーサイト
新しい記事を書く事で広告が消せます。
Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ
マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!
リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。
公開メール kenbishiP@gmail.com
さて、昨日dllを作ることでなんとか問題が解決しそうだと喜んだわけですが
案の定今日も問題にぶち当たる
勉強になっていいとは思うのですが、あんまり進まないのもきついなぁw
VC++2010でdllをつくろうと思ったのですが
System::Drawing名前空間が認識してくれない
昨日2つ手段があるといったクラスライブラリと win32アプリケーションの作成
初めはクラスライブラリで作ろうと思ったのですが、Drawingが認識しないので
試しにwin32の方でやってみても やっぱり認識しない
win32の方はとりあえず、Frameworkを使わないとSystem::Drawingが見えないのはわかったので
共通言語ランタイムサポートを (/clr)にしました
これでSystemは認識してくれたのですが
Drawingはだめ
もしやと思って 参照から Drawing.dllを追加
これでいけるか と思ったら
Drawingは開けないと来たもんだ
くっ
openCVのラッパーとやらを使えばC#でもopenCVが使えるみたいなので それも考慮に入れてもう少し粘ってみます
やっとシリアル通信が再びつながりました
ってか、実は詳しくはまだ良くわかってませんw
こうやったら出来るよというのを参考にしたら出来ましたが、なぜそうなるのか
まだわかってないのです
とりあえず自分の覚書としてコードを書きます
#pragma endregion
private: System::Void hScrollBar1_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e) {
String ^ s_data1 = textBox1->Text;
data1 = hScrollBar1->Value;
textBox1->Text = data1.ToString("D3");
serialPort1->Write("A"+s_data1+" \r\n");
}
private: System::Void hScrollBar2_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e) {
String ^s_data2 = textBox2->Text;
data2 = hScrollBar2->Value;
textBox2->Text = data2.ToString("D3");
serialPort1->Write("B"+s_data2+" \r\n");
}
private: System::Void hScrollBar3_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e) {
String ^s_data3 = textBox3->Text;
data3 = hScrollBar3->Value;
textBox3->Text = data3.ToString("D3");
serialPort1->Write("C"+s_data3+" \r\n");
}
private: System::Void hScrollBar4_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e) {
String ^s_data4 = textBox4->Text;
data4 = hScrollBar4->Value;
textBox4->Text = data4.ToString("D3");
serialPort1->Write("D"+s_data4+" \r\n");
}
private: System::Void hScrollBar5_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e) {
String ^s_data5 = textBox5->Text;
data5 = hScrollBar5->Value;
textBox5->Text = data5.ToString("D3");
serialPort1->Write("E"+s_data5+" \r\n");
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
serialPort1->Open();
textBox11->Text = "ポートオープン";
}
delegate void SetTextCallback(String ^);
private: void SetText(String^ str){
array<Char> ^data = str->ToCharArray();
switch(data[0]){
case 'A': textBox6->Text = str->Substring(1,3);break;
case 'B': textBox7->Text = str->Substring(1,3);break;
case 'C': textBox8->Text = str->Substring(1,3);break;
case 'D': textBox9->Text = str->Substring(1,3);break;
case 'E': textBox10->Text = str->Substring(1,3);break;
}
}
private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
String^ str;
str = serialPort1->ReadLine();
this->Invoke(gcnew SetTextCallback(this,&Form1::SetText),str);
}
private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
serialPort1->Close();
}
タチコマ用の操作ソフトを作るため
VC++ 2008 のC++/CLIでシリアルポートを使ったプログラムを組んでみたところ
うまくいかない・・・
シリアルポートクラスは以前使った時特に問題なく使えたのに
今回はなぜ
すこし調べてみたところ
シリアルポートクラスの DataRecievedイベントは セカンダリスレッドで動くらしい
スレッドというものの概念をまだ理解していないが
セカンダリスレッドで動いているものがメインスレッド上のオブジェクトに働きかけようとするとエラーになるようだ
はてさて、
ではどうやってそれを許可すればいいのだろうか
ってか、この前作ったプログラムも大体同じようなことさせてたんだが・・・
あれはなぜうまくいったのか
エラーが取れたので
さっそくフォーム上にカメラの映像を描画する基本プログラムを組んでみました
プログラムはこちら
IplImage *img;
CvCapture *src;
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
src = cvCaptureFromCAM(0); //カメラを選択
img = cvQueryFrame(src); //カメラの画像を1フレーム読み込む
if(img == NULL){
textBox1->Text = "ファイルが読み込めません";
}
pictureBox1->Width = img->width; //ピクチャーボックスのサイズを画像の幅に合わせる
pictureBox1->Height = img->height; //ピクチャーボックスのサイズを画像の高さに合わせる
timer1->Interval = 33; //タイマーを33msごとにセット
timer1->Start(); //タイマースタート
}
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
img=cvQueryFrame(src); //1フレーム読み込み
Bitmap ^ bmp = gcnew Bitmap(img->width,img->height,img->widthStep,
System::Drawing::Imaging::PixelFormat::Format24bppRgb,IntPtr(img->imageData));
//ビットマップクラスの作成
pictureBox1->Image = bmp; //ピクチャーボックスに描画
}
private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
cvReleaseCapture(&src); //カメラの開放
}
}
さて、openCVをつかって カメラの映像を取得するプログラムは難なく成功したわけですが、
コンソールアプリケーションではなくフォームアプリケーションを作りたい!
ってなわけで、
作ったプログラムを応用して フォームアプリケーションでのコーディングをしようとしたのです
が!
ここで最初の問題が
なんか変なエラーが・・・
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\emmintrin.h(27) : fatal error C1189: #error : ERROR: EMM intrinsics not supported in the pure mode!
試しにプログラムを組んだはいいが、こいつがなかなか消えてくれない
何が悪いのかいまいちわからないから、 自分で記述したところをどんどん削っていくと
インクルードファイル
#include
#include
の存在がすでに気に食わないらしい
悩んで悩んで一時間後
プロジェクト(P)→ ×××のプロパティ → 構成プロパティの全般
共通言語ランタイム サポート を 共通言語ランタイム サポート(/clr)
にしたら無事エラーが消えました
なんとか一安心
出鼻くじかれるかと思ったw