• 締切済み

テラタームとRS-232cについて

テラタームでPCにデータを送る際に、自分の来て欲しいデータ量と実際のデータ量に違いが出ていて困っております。 現在、東京エレクトロンデバイスの評価ボードを用いてカメラから来るデータをRS_232cで転送しているのですが、 307200バイトのデータが欲しい所実際は100から200前後のずれが出てしまいます。 テラタームを用いてデータを受信する際、フロー制御のxon,xoffを設定すれば PC側のバッファが足りなくなった時自動的にxoffを送り、大丈夫になった時は xonを送ってくれて、送信側はそれの受理さえすれば良くて 自分は返事を返す必要もなくただそれに従って動けばいいと言う事でしょうか? そうなれば評価ボード側にxonとxoffを受理出来る様な仕組みを作りさえすれば大丈夫な気がするのですが・・・・ また、データを送る間隔を増やしてもなかなか思い通りには行きませんでした。 RS_232cで一度に307200バイトのデータを送る事自体が無謀なのでしょうか? 数秒の間隔を空けて、少しずつデータを送るしかないのでしょうか? 現在APIも少し見てはいるのですが、テラタームで出来なければ APIを使っても無駄な気もしています。 以下の環境で動かしています カメラ:dalsa FA21-3HK3H-00-R 評価ボード virtex5 TB-5V-155T-GB-R クロック→80MHzを921600bpsに合わせて、86分周 クロックの分周も問題の様な気がしますが、921600用にとなるとどうしても正確な値に近づけるのは難しく・・・・ 何か助言を下されば幸いです、宜しくお願い致します

みんなの回答

回答No.1

通信速度は921600bpsということでよいですか。 一般的なPCのシリアルポートは、115kbps程度までです。この辺は大丈夫ですか。 80MHz / 86 = 930232.6 で送信したとすると、 930232.6 / 921600 = 1.0094 で、約1%位送信側が速いということですね。 たしか、シリアル通信は、同期信号を送っていないので、送受信側のタイマのずれが、受信側のデータを取りこぼしに繋がっているのだと思います。 とりあえず、通信速度をいろいろ変えてみて、エラーが発生具合を見てみては。 シリアル通信でエラー無しを保障することは難しいので、最終的には、エラー部分だけ再送するような仕組みも必要になると思います。 肝心のフロー制御の部分については、詳しくないので、わかりません。ごめんなさい。

kujira12gou
質問者

お礼

ご回答ありがとうございます。 PCの物理的な対応の是非は調べていませんでした、そこをまずは調べようと思います!! あとすいません、確認したら分周0~86なんで87でした^^; ただそれでもほぼ100%になってしまっているので、あと少し落として ずれのポイント等を試してみる事にします^^

関連するQ&A

  • RS-232Cでバイナリデータを受信する方法

    2台のPCを使用しバイナリファイルをRS232Cを使用し1台目のPCは送信専用、2台目のPCは受信専用で、送信側のPCから出したデータを受信側PCでデータの内容を判断し集計するプログラムを作ろうとしています。 送信側のPCでは、"AAB9AAC2AACC01D8AAE2・・・”といった内容のバイナリファイルの内容を1バイトずつ読み込み、それをMsCommを用いてバイナリモードで送信させて、EOFになるまで永遠とそれを繰り返します。 問題は受信側で、たとえば上記のデータの中の"AAB9"ならばカウントを1つ上げる、"AACC01D8"ならばカウントを1つ下げ、それを表示するといったような処理をリアルタイムで行いたいのですが、どうしてもデータの取りこぼしが発生します。 また、データの意味合いとしては、必ず"AA"という1バイトのデータから始まり、それに1バイトから5バイトまでのデータが可変長で付いてきて次の"AA"までが1つの意味となります。 通信パラメータは9600、8ビット、ストップビット1、パリティなしで、その他の制御線は一切使用しないという条件です(要するにRxD、GND線のみの最低限の条件) 受信側のバッファは1024バイトで、MSComm1.RThreshold = 1でOnCommを発生させています。また、送信側のファイルの大きさは1kバイトほどです 正直なところ、このようなことが可能なのかどうかもわからない状況なのですが、現状ではデータを数バイト取りこぼしているだけのようなのでできないことはないのではないか?と考えています。 どなたか、参考文献、ホームページ、プログラム、考え方等を何でもかまいませんん!ぜひ、ご教授願います!!また、現在はVBにて開発中ですが、最悪、言語は問いません。よろしくお願いいたします。

  • RS232Cからイーサネット(LAN)への通信移行

    現在RS232CでPCとある外部機器で通信しているシステムをLAN経由に変更します。PC側はアダプターを入れるのでなく、ソフト自体を書き換えます。外部機器側ははっきりしませんが既存のRS232C通信を何かで変換するのではないかと思います。この場合、通信方式として一般にTCPとUDPが考えられますが、どちらにするべきか決めかねています。それぞれの概略は理解しています。 現在はRS232Cなので、受信データエラーはアプリで判断し再送要求をだす仕組みです。通常は、PCからデータ送信要求を出す⇒外部機器からデータ送信⇒ACK応答⇒EOTの様な手順です(PCからデータを送ることもあります)。この手順をそのまま生かすのであればUDPにするのが妥当なような気がするのですが、TCPの方が一般的とも聞きます。TCPにした場合、通信エラーはTCPプロトコル内でリカバーされるのでアプリの再送要求などは無意味になってしまう用に思えます。解釈が違っているでしょうか。 アプリレベルでの通信手順に大幅な変更を加えないという条件でどちらにするのが妥当なのかご意見をお聞かせください。なお、1回の通信データは長くても200バイト程度で、、通信インターバルは1回/秒程度です。

  • RS232Cを用いたSCIでのシリアル通信について

    PCで計算して吐き出した5~6個の数値データ(それぞれ3桁の数字で最大2バイトあれば足りる大きさです)をRS232Cを使ってSCIでマイコンに送り、マイコン側でそのデータを使って計算する、というシステムを考えています。 色々勉強してみたのですが、例えばPC側プログラムがテキストデータで吐き出した数値を読み込んで送信する場合、全てアスキーコードで送られてしまうのでしょうか?少なくともキーボード入力の値はアスキーコードで送られているようだとはわかりましたが・・・。 また、まだアルゴリズムは考えてませんが、PC側の計算プログラムから直接に数値をPC側送信プログラムに渡してあげた場合は、やはりそのままの値(例えば8なら1バイト2進法で00001000で送られるものなのでしょうか? 開発環境はC言語で、マイコンはSH2だということです。通信は今はテスト段階でハイパーターミナルを使っていますが、いずれは命令を出したときに適切な値を送信するようにしたいので、C言語で書かれたSCI通信のフリーウェアなどを使う検討もしています。 その理由はC言語プログラムの中にハイパーターミナルをどのように含めればいいのかわからなくて・・・ C言語でできたソフトなら、そのままPC側計算プログラムに組み込めばいいかなぁと思いまして・・・。(浅はか?) この点についてもご教授頂ければ幸いです。 説明不足かもしれませんが、その場合はご指摘ください。 どうぞ、宜しくお願いいたします。

  • RS-232Cにおける制御についての質問です。

    プラグラミングに対して、全くの初心者のものです。 DelphiでRS-232Cの制御を行おうとしているところですが、どのようにプログミングすればよいのかまったくわかりません。 一応説明書に書かれていることを記します。 (通信ポート設定) Baud Rate 9600,Stop Bit 2,Parity non,Word Length 8,Flow Control XON/XOFF RTS,DTR (通信パケット仕様) ・パケットは全て ヘッダー'#'と、ターミネータ'\r'で区切られる。 ・パケット内の数値データは、全て16進のアスキーコードで表記。 ・機能に応じて以下の4種類のパケットがある。 (1)コマンドパケット (2)リプライパケット (3)イベントパケット (4)データパケット (パケット一覧) (1)Command Packet Format : '#[FID] [P1] [P2] ..[Pn]\r'   項目   型      内容   FID short ファンクションID   Pn long n番目のパラメータ (2)Reply Packet Packet mode 0 Format Normal Reply '#0 [Reply]\r' Data Type: NUM '#0 [Reply] [Data1] [Data] ..[Data n ]\r' Data Type: STR '#0 [Reply] [Strings]\r'   項目   型    内容  Reply short リプライコード            0:正常終了 1:コマンドエラー 2:パラメータ           エラー 3:ビジーエラー 4:通信エラー            10:コマンドに依存したエラー  Data long n番目の数値データ  Strings char* 文字列データ (3)Event Packet Packet mode=1,Format '#1[Event ID][Event Data]\r7' 項目      型     内容 Event ID short イベントの種類 Event Code long イベントの内容 実際のコマンド仕様を記すのでよろしくお願いします。 1.Connect [動作]PCと装置の回線を確立する。 [引数]FID 1 P1 0:イベント出力・・・無効 1: ・・・有効 [戻り値] 0:正常終了 2:パラメーターエラー 3:ビジーエラー 2Set Data Output Interval [動作]データの出力間を設定する。 [引数]FID 7, P1 0:固定,P2 出力間隔 0,10(0xa)~100(0x64)[/10sec],P2=10の時は1秒間隔でデータを出力する,P2=0の時は出力しない。 [戻り値]0:正常終了,2:パラメータエラー 宜しければ、ちょっとした手がかりで構わないので投稿よろしくお願いします。

  • RS232CとPCの無線化接続について

    お世話になっております。 №28812で質問した者です。 ゴードーさんよりケーブルを購入しNCフライスの設定を変更してみたところデーター送信うまくいき、現在PCよりデーターを送って使ってます。 前にうまくいかなかったのは多分NC側の設定を間違えたのかもしれません。 ご教示頂いた皆様ありがとうゴザイマシタ。 そこで今度はちょっと欲が出てきましてPCとNC機の間のケーブルが気になってきました。 ちょうど通路側になっておりましてケーブルに足を引っ掛けてPCを落とすのではないかと・・・ インターネット等で調べるとRS232C無線化コンバーターというものが 存在するようですが、実際に使われていらっしゃる方がおられましたら、使用状況など教えていただけると助かります。(またはお勧め機種など・・・) 無線で飛ばすのでノイズに弱いとか、なんでも結構ですのでよろしくお願いいたします。 当方の使用環境は PCとNC機の距離は0.5m PCと溶接機の距離は15m PCと放電加工機の距離は25m

  • RS232C通信のC言語プログラム:入力モード?

    ある計測機器(以後(A)と略記)と"一般的な"Linux PC(Kernel 2.4xx)とをRS232Cシリアルポートで接続し、コマンドの送信とデータの受信を一定時間間隔(1秒)で行うためのC言語プログラムを作成しようとしています。第一段階として、Windows XPのソフトウェア:ハイバーターミナルで(A)にコマンドパケット(10バイト程度)を送信し、それに対応するデータ(20バイト程度)を(A)の取り扱い説明書どおり、正しく受け取ることができました。(A)の受け付ける通信データフォーマットは”8 data bits, 1 stop bit, no parity bit"で、通信ケーブルはいわゆる3線式で、フロー制御は用いません。通信レートは9600baudです。  (A)から返される20バイト程度(長さはまちまちです)のデータパケットは全て、最後が[;FF]の"アルファベット3文字"で終わっていて、いわゆる”行末コード”は付加されていません(取扱説明書でも確認ずみ)。このような場合に、linux上でのC言語プログラムで(A)が接続された/dev/ttyS* (*は一桁の数字)から、どのような入力モードでread()すればよいか、アドバイスをお願いいたします。事前調査の段階ですが、今考えている方法は (1)ループの中で、ノンブロッキングモードでひと文字ずつ読んで、自分で用意したバッファに納めつつ、その最後が";FF"になったらループを脱出する というものですが、制御用のLinux PCは他にも”作業をしていて”、(A)とのデータの授受の負荷は軽いほどよいので、より賢明な方法がないか探しています。 たとえば、 (2)カノニカルモードで、一時的に、”行末コード”にセミコロン";"を指定して、read()する などということは可能でしょうか。これが可能なら、次の"FF"は、2文字を指定して”読み捨てる”ことも可能になります。 わかりにくい説明で恐縮ですが、他のアイデアなどを含めて、アドバイスをお願いいたします。

  • ハイパーターミナルによるRS-232C通信

    仕事の関係でアラーム用PCからRS-232Cで受けた信号を特型I/Fユニットで分配して4つの業務用機器を制御するというこの特型I/Fを発注したのですが 現場に納めたところうまく動作していないと言われ近日中に動作チェックをしたいのですが当方営業職なものでやり方がよくわかりません。 (製作元ではアラーム側と同じ信号を出してI/Fから信号がでることを確認済) ハイパーターミナルを使えばできそうだということなのですがどうすればいいのでしょうか。 わかりやすいサイトなど教えて頂けないでしょうか。 USBに接続するD-sub9ピンの変換コネクタは持っています。 通信プロトコルの規格は以下になります。 非同期:転送レート9600kbps:データ長7ビット:ストップビット1ビット:パリティ偶数:フロー制御RTS/CTS(ケーブル端末処理) 動作確認したいことは下記です。 1:アラームPC側から11バイト長のメッセージが送られてくるらしいので、PCと直接繋いでコマンドが正常にきているか受信したい。 2:1が正常なことを確認できた上で特型I/Fの出力から同様のコマンドが出るのかを確認したい 3:アラームPCのかわりにノートPCを繋いでメッセージを送信したい。 他に必要な情報あれば指摘下さい。 よろしくお願いします。

  • 古い計量機器からのrs232cを使用したデータ入力について

    知り合いが現在、15年以上たった計量器を利用してましてPCの入れ替えを機会に、この計量器からデータを取り込めないかと相談を受けました。計量器メーカーからは手書きのコネクタ配線図を入手しましたが 計量器側のコネクタ=フルピッチ50ピン pin1LSB~16MSB(バイナリ出力) 17~25(なし) 26~50(GND) コンピュータ出力  トランジスタ・オープンコレクタ  負論理、バイナリ と言う内容だけでした。 この出力から現在のPCへrs-232c入力として25ピンか9ピンへ取り出すためにはどのような結線のケーブルが必要でしょうか?私は16ピンからバイナリ出力では9ピンに入力不可能な気がします。今ある情報は全て書きましたがこの情報だけでの判断は難しいでしょうか? ちなみに、入力データ処理についてはvbで作成予定です。 よろしくお願いします。

  • C言語->アセンブリ->C言語で構造体渡し

    OS開発をしています。 たとえば、 typedef struct test{ int t1; int t2; int t3; int t4 int t5; }test; という構造体があったとして、 ----アプリケーション---- void main(){ test data; data.t1=100; data.t5=200; testint(data); } ----ライブラリ(アセンブリ)---- _testint: PUSH EBX MOV EBX,ESP INT 0x52 POP EBX RET ----OS側---- int API(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax){ test data; data= *(((int *)ebx) + ?); … // ↑ } というプログラムのとき、 ?には、どのような数字を入れれば、 OS側のdataにアプリ側のdataが代入できるでしょうか。 test構造体のサイズは、 20Byteです。 長い質問ですが、回答お願いします。

  • カメラリンク出力の仕方について教えてください

    SonyのXCL-5005CRのカメラとリンクス社のデジタルカメラ用画像出力ボード銀河digital-CL2を使用して画像をパソコンに取り込もうとしたところ画像が正常に取り込まれなくて、カメラとパソコン側の出力方式が違うことまでjは分かったのですが、出力変換の仕方が分かりません。 パソコン側の出力がRGB方式で、カメラがRAW方式です。どちらを変換するほうが簡単ですか? また、カメラの設定を行う場合はRS232Cを用いたほうがいいらしいのですがどなたかやり方を教えて頂けませんか?よろしくお願いします。