Visual Basic ver.6を用いてRS-232-Cデータ転送のプログラムを書いています。
転送には,MSComm controlを用いています。
コンピューター側から命令コードを測定器側に送信すると(例えば,MSComm1.OutPut = "F,3,300," & Chr(13)のように),測定器側からは次のようなテキストデータの転送が指定された回数だけ起こります:

@C/R
数値データC/R
数値データC/R
・・・・
・・・・
(指定回数繰り返す)

そこで,質問ですが,このデータをMSComm1.Inputを介してきちんと取得する方法をお教えください。私がよく理解できいない部分は,「どのような形でbufferにデータが落ちているのか?」という部分と「繰り返し処理をどう記述するのか?」という部分です。多分後者は配列型変数を用いて「指定回数」だけ繰り返すことになると思いますが・・・・。
なお,データ転送の制御フォーマットはデータのみの転送で,STXもETXも使用していません。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

こんばんは。



これで、試してみてください。
'<<送信側>>
Private Sub Command1_Click()
MSComm1.InputLen = 0
MSComm1.PortOpen = True
MSComm1.Output = Text1.Text + Chr(13)
MSComm1.PortOpen = False
End Sub

'<<受信側>>
'起動時にポートを開いておきます。
'Timer1を貼り付けてIntervalを100程度に。
Private Sub Timer1_Timer()
Dim strBuf As String
strBuf = MSComm1.Input
If Len(strBuf) <> 0 Then
List1.AddItem strBuf
End If
End Sub

もし、受信データ長が同じ長さなら、OnCommイベントで
データ取得した方がいいのですが・・・
    • good
    • 0
この回答へのお礼

大分,返事が遅れまして申し訳ありませんでした。
また,御助言ありがとうございました。
御助言の通り,Timer controlを使ってTimer Eventを発生させ,Timer1.Interval = 適当な値(実験では,50 msecくらいが適当)で機器からデータを取得するとうまく行きました。
参考までに記すと,氏の最後の助言をヒントにして,さらに次のようにすると完全にデータを取得できました。1データ(@ & VbCr)を取得したところでTimer1.Enabled = Falseにして,Handshakingをするようにコードすると,以後は一定長のデータが送信されてくるので,OnComm Eventを発生させてデータを取得することができました。
大分苦労しましたが,氏の助言,たいへん参考になりました。ありがとうございました。

お礼日時:2001/09/24 17:49

ANo.#3の訂正です。




もしかするとInputLen=0で一行(つまりCRまで読み込むのかもしれない)と書きましたが、
InputLenで指定したサイズまで一度に取り出しせました。



InBufferSizeが十分なサイズで、コマンドを送ってから
Inputまで十分な時間を確保しているのであれば測定器側から
データが来ていない可能性があります。


または、コマンド送信からInputまでの時間が短く、@C/R
を受信したタイミングでInBufferからデータを読んでしまっているとか。
    • good
    • 0
この回答へのお礼

再度の御助言ありがとうございます。
実を申しますと,現段階での「結論」はponntaさんご指摘のことを考えています。とはいうものの使っているノートがたびたびハングしているうちに「ハードディスクがクラッシュ」したようで,修理に1週間程度かかるはめに陥りました(心境は(;;)です)。
使っている機器の測定値を「瞬時」呼び出すコマンドがあって,コマンドボタンに連動させて呼び出しプログラムを書くと,最初のクリックでは最初の2文字しかバッファーに入りませんが,次のクリック以降はちゃんとデータがすべてバッファーに収まり,ちゃんと数値を呼び出すことができます(これ自身不思議な現象ですが)。
データは,
@ C/R
5文字の数値データ C/R です。
従って,inputまで若干時間を開けるようなコードを記載してタイミングを計るか,ボーレイトを変えてテストするようなことを現在考えています。
「結果」は若干間が開きますが,後日報告します。
また,何か御助言等,思い付きましたらお知らせください。

お礼日時:2001/09/18 12:23

私が作った受信プログラムでですが、InputModeはバイナリにしていました。


Sub MSComm1_OnCommで、MSComm1.CommEvent が comEvReceive のときに
MSComm1.Input していますが、バッファに入っているものを受け取ると、
CR で切れているわけではないので、Inputを繰り返して、前の文字列と
連結して、通信が終わったところで、文字列処理でCRのところまでを1行
として分割していました。なお、InBufferSizeは2048にしています。
もっといい別の方法があるのかもしれませんが。
N88からの移植は、何かと相違点があって大変ですね。
では
    • good
    • 0

INPUTを繰り返しても次のデータが読めませんか?




私見ではありますが。
bufferはリングバッファになっていてInBufferSizeでしていしたバイト数だけ、受信したデータが格納できる。

inputで読み込まなければInBufferSize以上受信したものは取りこぼしが起きる。(後からきたのが格納できずに捨てられる)

inputでInBufferのデータが読み込まれる。読み込まれるのはInputLenで指定したバイト数(バイナリ時)、
このとき読み込んだバイト分、バッファの空きが増える。
(テキストは使ったことがなので良くわからないが、もしかするとInputLen=0で一行(つまりCRまで読み込むのかもしれない))


InBuffrtCountを使うとInBufferに格納されているデータのサイズを取得できるのでこれが2以上なら数値データも格納されているはずです。
たとえばInBuffrtCountが0になるまでInputを繰り返してみるとか・・・

CRはコントロールコードなので取得できると思います

この回答への補足

御示唆,ありがとうございます。
バッファーの特徴がおぼろげながら理解できるようになりました。
これまでのところ,いろいろ条件を変えて(例えば,MSComm1.InputLen = いろいろな値)トライアンドエラーを繰り返していますが,うまくいきません。共通している事実は,MSComm1.InBufferCount = 4が最高値です。つまり,データの最初の1行しか読みこまないということです。
以前まで,この計器からのデータを取り込むために,N88-Basicでコードしたプログラムを使っていました。従って,一応 @ & chr(13) の後のデータもパソコンには送られているはずと思っています。
多分,「単純なミス」に起因してうまくいっていないような気がするので,現在は,初心に帰って,データが送信されているかどうか?からチェックしているところです。

補足日時:2001/09/16 16:00
    • good
    • 0

うんざっくりしたプログラムは書いていただいた方がいいのですが



気になるのは.InputLen = 0で0にせずに処理しているのでは?

あとバイナリモードでないとCrは取れないと思うのだけど

.InputBufferLenの値を考慮してないとか

非常に簡単なプログラムになるとは思うのですが受信のみならば

という事で補足願います。

この回答への補足

御示唆ありがとうございます。

InputLen に関してはどんな値でも同じ結果でした。つまり,データの最初の1行,@ C/Rしか表示できませんでした。
また,InputBufferLenの値も今度の問題には関係ないようです。

補足日時:2001/09/16 15:52
    • good
    • 0

測定器の制御をされているのですね。

私もそうです。
MSCommコントロールの使い方については、資料や例が少ないので、
大変です。がんばってください。

さて、測定器に命令を与えてからリターンが返ってくるまでの大体の時間は
把握されていますか?大体の時間がわかるなら、命令を発してからその時間
だけ待って(ポーズをかける)、MSComm1.Inputすると読めるでしょう。
この時測定器からのリターン文字列の長さが想定できるなら、
それだけ分のバッファをとっておけば1回で読めます。
リターン文字列の長さがわからないからといって、極端に長めに取ることは
メモリを食いすぎるので、適当な長さ分を取って何回かに分けて読むことに
なります。何回かに分けて読んだ文字列を&でつなぎ合わせるとよい。

MSCommコントロールは使いにくいといっても、フロー制御さえ間違わなけれ
ば取りこぼしはありません。ただ測定器が命令に関係なくデータを垂れ流す
仕様であれば、取りこぼしもやむを得ませんが。

この回答への補足

さっそくの御示唆,ありがとうございます。若干,補足します。
TXT1.text = MSComm1.Input の形で読み出せるのは最初の1行だけです。つまり,"@"だけです。質問に書いたのですが,「BUFFER」がどのようなものなのか?が理解できていません。最初のC/Rが来るとBUFFERはデータの取得を止めてしまうようです。従って,BUFFER SIZEを大きくとっても結果は同じです。
今度試してみようと思うことは,promeさんのヒントを基にして,1行読んで,表示し,bufferを空にし,1行読む・・・というような繰り返しが可能かどうか?です。
何かヒントがありましたらお教えください。

補足日時:2001/09/14 16:14
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

QMscomm を使用してバイナリでデータを受信したい

Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか?

(垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >)

また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか?

まず考え方として以下の流れでよいでしょうか?

バイナリデータをバリアント型の変数に入れる。(受信する)
     ↓
このデータを1バイトごとにバイト型変数の配列に入れていく。
     ↓
格納した配列の中の制御文字を取り除く。( ST、EX )
     ↓
配列に入っているデータを文字に変換する。
     ↓
変換した文字をつなぐ。

受信するデーターが制御文字を含んでいる為、テキストで受信するとおかしな動作をすることがあるので(150バイト程度のデーターを、バッファから変数に移すときに、0.5~2.5秒もかかってしまうし、文字化けも時々起こす。)バイナリで受信してその後文字に変換したいのですが・・・。

宜しくお願い致します。

Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか?

(垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >)

また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか?

まず考え方として以下の流れでよいでしょうか?

バイナリデータをバリアント型の変数に入れる。(受信する)
     ↓
このデータを1バイトごとにバイト型変数の配列に入れていく。
   ...続きを読む

Aベストアンサー

(記憶が薄いので、正確ではありません。)

Dim bytAry() as byte
として、それに直接受信してあげると必要な領域を勝手にVB側で用意してくれると思いました。

それを
Dim strWork as String
(1)strWork = strConv(bytAry,vbUnicode)
(2)strWork = strConv(bytAry,vbFormUnicode)
どっちかで変換だったと思うけど、それでバイナリデータを文字列化します。

そのあと
VB6ならReplace関数で制御文字だけを置き換えて使用すると便利かも?

最初に述べたように、かなり記憶があいまいです。環境がないので性格には答えられません。m(__)m

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

QMScommのOncommイベントが発生しない

ACCESSでMScommオブジェクトを使用し、ある機器からデータの読み取りを行いたいのですが、肝心のOncommイベントが発生いたしません。
なにか、ライブラリの参照設定が必要なのですか?
それとも、自分の設定間違い(不足)なのでしょうか?
前にVBでMScommを使用したことがありますが、なにも特別なことはしなかったような・・・(MSCOMM32.OCXを使用しています)
補足が必要であれば、追記いたします。

Aベストアンサー

ケーブル確認
>ある機器
は、特殊なケーブル接続では?
クロス/ストレートを間違ってないか?
使用しているケーブルが断線していないか?

>なにも特別なことはしなかったような
 プロパティは、あっていますか?

Accessだけで、NGとは考えにくいです。

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

QSQL ServerのストアドでOUTPUTパラメータを2つ

VB.NETとSQL Serverでストアドプロシージャーを使用しています。
OUTPUTパラメータを2つ使用したいのですが、VB.NET側での受け取り方法がよくわかりません。
ご存知の方がいらっしゃいましたら、よろしくお願いします。

Aベストアンサー

取得系ストアドの場合のサンプルです。

更新系ストアドの場合は
http://www.microsoft.com/japan/msdn/columns/vbnet/vbnet09102002.asp
を参考にしてください。



--サンプルストアド
CREATE PROCEDURE ストアド
--ALTER PROCEDURE ストアド
@パラム1_VAR_I VARCHAR(12),
@パラム2_INT_I INT,
@パラム3_VAR_O VARCHAR(26) OUTPUT,
@パラム4_INT_IO INT OUTPUT
AS
--パラメータ3を'aa'
SET @パラム3_VAR_O = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
--パラメータ4を100倍
SET @パラム4_INT_IO = @パラム4_INT_IO * 100

--パラメータ1を返す
SELECT @パラム1_VAR_I AS パラメータ1

--パラメータ2の10倍をステータスとして返す
RETURN @パラム2_INT_I * 10



'標準ジュール[Module1.vb]
Imports System.Data.SqlClient
Module Module1
  Sub Main()
    Const DEF_ストアド名 As String = "ストアド"

    'ユーザ名/パスワード/DB設定を修正してください
    Dim l_sqlコネクション As SqlConnection = New SqlConnection("server=localhost;uid=ユーザ;pwd=パスワード;database=master")
    Dim l_sqlコマンド As SqlCommand = New SqlCommand(DEF_ストアド名, l_sqlコネクション)

    With l_sqlコマンド
      'CommandTextの種別 = ストアド
      .CommandType = CommandType.StoredProcedure

      'パラメータ追加:戻り値
      .Parameters.Add(パラメータ作成("@戻り値", SqlDbType.Int, 4, ParameterDirection.ReturnValue))

      'パラメータ追加:引数(I/I/O/IO)
      .Parameters.Add(パラメータ作成("@パラム1_VAR_I", SqlDbType.VarChar, 12, ParameterDirection.Input, "abcde"))
      .Parameters.Add(パラメータ作成("@パラム2_INT_I", SqlDbType.Int, 4, ParameterDirection.Input, 2))
      .Parameters.Add(パラメータ作成("@パラム3_VAR_O", SqlDbType.VarChar, 26, ParameterDirection.Output))
      .Parameters.Add(パラメータ作成("@パラム4_INT_IO", SqlDbType.Int, 4, ParameterDirection.InputOutput, 3))
    End With

    'ストアド実行
    Dim l_sqlアダプタ As New SqlDataAdapter(l_sqlコマンド)
    Dim l_dstデータセット As New DataSet()
    l_sqlアダプタ.Fill(l_dstデータセット)


    '実行結果を出力
    Dim i As Integer
    Dim l_str結果 As String = ""
    With l_sqlコマンド.Parameters
      For i = 0 To .Count - 1
        l_str結果 &= i & vbTab & .Item(i).ParameterName.ToString & vbTab & .Item(i).Value.ToString & vbCrLf
      Next
    End With
    Call MsgBox(l_str結果, MsgBoxStyle.Information, "結果出力")

  End Sub

  'パラメータ作成関数
  Private Function パラメータ作成( _
          ByVal p_strパラメータ名 As String _
          , ByVal p_dtpDBタイプ As System.Data.SqlDbType _
          , ByVal p_intサイズ As Integer _
          , ByVal p_pdrパラメータ種別 As System.Data.ParameterDirection _
          , Optional ByVal p_obj初期値 As Object = Nothing _
      ) As SqlParameter

    Dim l_sqlパラメータ As New SqlParameter(p_strパラメータ名, p_dtpDBタイプ, p_intサイズ)
    l_sqlパラメータ.Direction = p_pdrパラメータ種別
    l_sqlパラメータ.Value = IIf((p_obj初期値 Is Nothing), vbNull.Variant, p_obj初期値)
    Return l_sqlパラメータ
  End Function
End Module

取得系ストアドの場合のサンプルです。

更新系ストアドの場合は
http://www.microsoft.com/japan/msdn/columns/vbnet/vbnet09102002.asp
を参考にしてください。



--サンプルストアド
CREATE PROCEDURE ストアド
--ALTER PROCEDURE ストアド
@パラム1_VAR_I VARCHAR(12),
@パラム2_INT_I INT,
@パラム3_VAR_O VARCHAR(26) OUTPUT,
@パラム4_INT_IO INT OUTPUT
AS
--パラメータ3を'aa'
SET @パラム3_VAR_O = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
--パラメータ4を100倍
SET @パラム4_INT_IO = @...続きを読む

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

QMSComm(comEvRing)について教えて下さい。

comEvRing'リング インジケータの状態が変化しました’とはどういう意味で、どういう状況なのか教えて下さい。

Aベストアンサー

リングとは電話のベルのことです。
だからcomEvRingは電話が掛かってきたとき(および呼び出しが中断したとき)に発生します。

もちろんこのイベントを使うには、シリアルポートのリング検出のピンも配線しないとつかえません。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報