• 締切済み

FT232RLを用いた通信について

FT232RLを使用してPC-マイコン間の通信を行いたいのですが、PC側のプログラムを書いているときにいくつか疑問に思う部分があります。 ・開きたいポート名が"\\\\.\\COM1"となっていますが、COM1の部分は開きたいポート名(コントロールパネルから参照できるもの)ということでわかるのですが、\\\\.\\の部分は必要なのでしょうか? ・BYTE型の配列を使用していますが、こちらの配列の大きさはマイコン側のUARTの送信あるいは受信バイト数にあわせて設定してやればいいのでしょうか? ・CSerialPortクラスのメンバーのReceiveData関数とThreadFunc関数はどうしてWINAPI(__stdcall)で呼び出されているのですか?自分の認識では__thiscallよりもthisポインタがスタックにpushされないので高速であるとは思いますが、そのような速度が必要なのでしょうか?それともマルチスレッドでの場合それが必須なのでしょうか? また、この部分はboostのthreadで代用は聞くのでしょうか? 使用言語およびIDEはリンク先と同じです。 よろしくお願いします。 参考: http://code.msdn.microsoft.com/windowsdesktop/COM-howto-4b79a479

みんなの回答

  • kaoaru
  • ベストアンサー率33% (42/127)
回答No.2

>\\\\.\\の部分は必要なのでしょうか? 全部必要です。 >BYTE型の配列を使用していますが、こちらの配列の大きさはマイコン側のUARTの送信あるいは受信バイト数にあわせて設定してやればいいのでしょうか? 一般的には、受信側がオーバーフローしないように対策します。テスト的に一発で受信するだけならピッタシにしてもいいかもしれませんが、別スレッドで受信処理をするとかになってくるとバッファの構造も考えなければいけなくなりますので単純にはいきません。 プログラムの構成次第、ってことになりますか! ・CSerialPortクラスのメンバーのReceiveData関数とThreadFunc関数はどうしてWINAPI(__stdcall)で呼び出されているのですか?自分の認識では__thiscallよりもthisポインタがスタックにpushされないので高速であるとは思いますが、そのような速度が必要なのでしょうか?それともマルチスレッドでの場合それが必須なのでしょうか? また、この部分はboostのthreadで代用は聞くのでしょうか? VCでしたか・・・。__stdcallで呼び出すというのは、アセンブリソースに吐き出してみるとよくわかります。IDEからですとできませんがコマンドラインからなら出せるハズです。 それをみれば一発解決なんじゃないでしょうか? ここにあることはよくご存知な内容だと思いますが念のため・・・。 http://keicode.com/winprimer/wp07b.php つまり、クラス内のメンバ関数は自身のモジュール内に存在するので独自形式の呼び出し方をする、という単にそれだけの話です。 これがDLLだったらこうはいかないのはおわかりだと思います。 なんでそうなっているのか? それはクラス設計をやった(たぶん、ライブラリ専門の納入業者?)人に聞かないとわからないと思います。 それがイヤならCSerialPortクラスなんて使わずに「自力」でやりなおす、ということになります。そんなモンです。 >boostのthreadで代用 それはできないでしょう?先の内容がわかれば。「自身のモジュール内に存在」でなければいけないのでダメです。 アセンブルリストにして該当部分だけ見れれば容易に理解できると思うんだけどなぁ~!そこを見つけるのが大変かもしれないけど・・・。 私はこのテの内容でも人に質問したりしたことないんです。最終的にわからなくなったらアセンブルリスト(それができる処理系に限るけど)で追うしかないやぁ~、ってやってしまうことになるからです。そのおかげで結構助かった・・・。無駄な時間もいっぱい・・・(笑) 今はVB6でやるのが仕事なんであんまりC++の機会がなくなってしまっているこの頃ですが・・・。C++はCBuider初版がメインだったりします。個人で買ったんで・・・。VCはめっきり使わなくなったなぁ!

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

ポート番号が 1~9 の場合は必要ありません。10以上の場合には必要です。 詳しくは、参考URLを。 http://support.microsoft.com/kb/115831/ja http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マルチスレッド

    ウインドウズプログラミングを始めて1ヶ月弱の初心者です。 色々探してみたのですが、結局良く分かりませんでした。 宜しくお願いします。 以下のリンクにおいて、 http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html 1)主スレッドとは、具体的にソースファイルのどこからどこまでのことを言うのでしょうか? そもそもスレッドとは何でしょうか?関数のことでしょうか? また、タスクとは、実行ファイルと考えて良いのでしょうか? 2)副スレッド(ThreadFunc)を作成すると、主スレッド(WinMain?)と副スレッドで並列処理をするとのことですが、CPUは普通一つしかないので、実際は、主スレッド(WinMain?)と副スレッドを常に切り替えながら動作すると思います。が、ここで疑問なのですが、主スレッドと副スレッドの切り替えはいつ誰が行うのでしょうか?また、切り替えタイミング(例えば1ms毎に切り替えたいとか)は自由に設定出来るのでしょうか? 3)"マルチスレッドは親プロセスのメモリ空間を共有します" とあるのですが、これは CreateThread(NULL , 0 , ThreadFunc , (LPVOID)hWnd , 0 , &dwID) の(LPVOID)hWnd を、副スレッド(ThreadFunc)に引数として渡しているから、つまり、主スレッドと副スレッドは、(LPVOID)hWnd だけがメモリを共有する、ということでしょうか? 主スレッドと副スレッドでメモリを共有すると、どんなメリットがあるのでしょうか? 4)マルチスレッドはこういう時に使うとよい、 というような大まかな判断基準があれば教えて下さい。 分かり辛い質問で申し訳有りません。宜しくお願い致します。

  • C#とマイコンでSCI通信

    マイコンとC#で仮想COMポートを使ってSCI通信しているんですが、 ・「マイコン⇒C#」でデータを受信するときは、  正常に受信でき、 「C#⇒マイコン」がデータを受信するときは    正常に受信できません。 ・C#から何を送っても0x0aの値しかマイコンが受け取りません。 (TeraTermからは正常な値を受け取っています) 以上の点から、C#の送信プログラムの中身が悪いと思うのですが、 C#は初めて手をつけたのでよくわかりません。 送信にはWriteLine()関数を使っています serialPort1.WriteLine("a"); このような感じで一文字一文字送り、マイコンでLCDに表示させ結果を見ています。 シリアルポートの設定は次のように行っています try { beginTime = DateTime.Now; //←プログラムの関係上いれてるだけです this.serialPort1.PortName = this.textBox2.Text; this.serialPort1.BaudRate = 9600; this.serialPort1.Parity = System.IO.Ports.Parity.None; this.serialPort1.DataBits = 8; this.serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.Open(); serialPort1.DtrEnable = true; serialPort1.RtsEnable = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } COMポートに関してはFormに別途ボタンを作りそこから選択するようにしています。 どこが悪いのか概要だけでも教えてほしいください;; よろしくおねがいしますm(__)m

  • VB6のRS232C通信で75bpsは可能ですか?

    WinXP VB6 にて開発をしています。 RS232Cで通信する必要があり、相手側のボーレートが75bpsとのことです。 しかし標準COMポートでは、最低は110bpsしかサポートされておりません。 デバイスマネージャのCOMポートを確認したところ、75bpsにて設定が出来ますので、 WinXP自体は対応されていると思います。 この状況でどうすれば通信が可能でしょうか? たとえば。 このソフトをインストールしたらVBでCOM通信ツールが使える? DLLを作ればいい?? API関数がある?? もしくはこの質問サイトにはプログラミングの猛者がいる。そっちで聞いてみれば? というようなサイト、ご存知でしたら教えて下さい。

  • アトメルマイコンのSPI通信ISRルーチン書き方

    現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

  • PICとパソコンの通信について質問です。

    現在、「PICで楽しむネットワーク接続機器の自作」という本でPICの勉強をしております。 PICおよびC言語に関しては超初心者です。 初心者なので本の通りに作成した実験基盤と本に付属していたVBのソフトを使用し、パソコンで実験基盤は本の通り正常に動作しております。 (具体的にいえば第6章の6と7のUDPおよびTCPでの操作の部分です。) さて、質問の内容ですがUDPでもTCPでも同じ結果ですが、1対1(マイコン1、パソコン1台)では問題無いのですが、1対2(マイコン1、パソコン2台)になるとどちらのソフトもフリーズしてしまいます。 ネットワークに関する知識もないので、ポートやらその他の事情(マイコン側の制限?・VBソフト側の制限?)でこうなるのかもしれませんが、1つの基盤を2台以上で操作できるようにするにはどのようにすればよいかわかりません。 どのようにすれば2台以上のパソコンで同時に操作できるようになるのでしょうか? UDPの場合、PIC側はローカルポート10002、リモートポート10001で通信しているようです。(TCPは50002と50001) そもそも2台のパソコンからPIC側の10002のポートへは複数の通信はできないのでしょうか? 質問の内容自体詳細にどのようなことを説明すれば良いかも理解しておりませんが、この内容で理解できる方は問題ありませんが、できれば本をお読みになった方にご回答いただければ幸いです。 よろしくお願いいたします。

  • (マルチスレッド)_beginthreadexに複数の引数を渡す

    現在プログラムでマルチスレッドをやろうとしているのですが、 マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか? MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを 指定できるとあったのですが、その意味が良くわかりませんでした。 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は どのように書けばいいのでしょうか? #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI MyThread( void *lpx ){ while (1) { printf("スレッド実行中\n"); Sleep(1000); } return 0; } void main(){ // スレッドに渡したい変数の宣言 int a = 128; int b = 256; int c = 512; // スレッドIDの宣言 DWORD thID; // マルチスレッドの開始 (HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID ); // ループ while (1) { printf("メイン関数実行中\n"); Sleep(2000); } }

  • VirtualBoxでのシリアル通信設定について

    VirtualBoxを使用したシリアル通信の設定方法について教えて下さい。 以下、やりたいこと及び、環境(設定)です。 【やりたいこと】 ホストOSとゲストOS間でシリアル通信を使用して、 データの送受信等をやりたいです。 【環境・設定】 ・VirtualBox ver.4.0.10 ・ホストOS WindowsXP SP2   通信ポート設定     COM1 有効     IRQ   04     I/O範囲 03F8~03FF   使用ソフト  ハイパーターミナル、SeriaDdebug ・ゲストOS Fedora8   通信ポート設定(VirtualBoxの設定→シリアル)     ポート1     シリアルを有効化にチェック     ポート番号 COM1(※COM2もやってみましたが、結果は変わりませんでした。)     IRQ     4     I/Oポート 0x3F8     ポートモード ホストデバイス     ポート/ファイルパス COM1     ※ポート2は設定していません。   使用ソフト minicom、自作アプリ ※上記条件でVirtualBoxのfedoraを立ち上げて、ホスト側でシリアル用ターミナルを 起動すると、ポートが開けません等のエラーログ(ポップアップ)が出ます。 設定方法、そもそものできる出来ない等のアドバイス、回答をお願い致します。 よろしくお願いします。

  • Internet explorer から COM portへのアクセスの方法

    PC(OS XP)のbrowserからSerial port(RS232C)しか持っていない機器にあるファイルを見たいのですがどうして良いのか途方にくれています。 特にパソコン側でCOM port(シリアルポート)をExploreなどのbrowzerでアクセスする方法をお教え願えませんか。 機器側にあるエンベデットシステムは、マイコンなのでTCP/IPのプロトコルの実装は、出来そうだと考えています。しかしそのこともインプリするほど理解できていませんので、関連の判りやすいサイトなどお教え願えればうれしいです。

  • PCにCOM1ポートに接続しているかの検証はどうすればよいか。

    ある輸入分析装置のデータをPCのExport使用としています。マニュアルどうりに条件(Baud, Data bit, Parity, Stop bit,Handshake, Configuration)にしました。分析側のCOMポートとPC側のCOMポートを同じにせよとの指示があります。そこでPC側のポートがCOM1となっているのか検証したかと分析装置のメーカーから言われました。COMポートの検証はどうすればいいのでしょうか。

  • マイコンプログラム - 16進をキャラクタに

    10BitのADCのメモリを読んでキャラクタに変換、UARTで送信、と言ったことを考えています。 (unsigned short)adcmem = 0x03FF →  (unsigned char)res[4] = {'0','3','F','F'} ただC言語環境下でのマイコンプログラムであるためsprintfなどといった関数は使用できず困っています。 何かよい案があればよろしくお願いします。