お世話になっております。

やりたいのは、MSCommを使用しデータを送った時、
データのチェックをしたいのですが、Chr関数(値を151を入れる)で作った文字をAsc関数で戻すと値が0になってしまってチェックできません。
文字列で受け取ったデータをどのようにコード変換したらよいでしょうか?

VBのバグなのか知りませんけど、
例えば、Asc(Chr$(151))、AscB(Chr$(151))は0を返し、AscB(ChrB$(151))だけが151を返します。

使用しているのは、
VB6SP4
Win2000です。

宜しくお願い致します。

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

A 回答 (1件)

たしかにChr$(151)は「0」を返しますね


ただ、この値は制御文字かな?(あまり自信ありません)
自分がASCIIコードの調査用に作成したコーディングを下記に記します
イミディエイトウィンドウにて確認できます
着眼点が間違っていたらすみません
'~~~~~~~~~~~
Dim Tmp As String

Private Sub Command0_Click()
Dim i As Integer
Tmp = ""
For i = 0 To 255 Step 1
Tmp = Tmp & Chr$(i)
'Debug.Print Format(i, "000") & " : " & Chr$(i)
Next i
Debug.Print Tmp
End Sub

Private Sub Command1_Click()
Dim i As Integer
Dim n As Integer
Dim w As Byte
Dim ret As String
n = Len(Tmp)
ret = ""
For i = 1 To n Step 1
w = Asc(Mid(Tmp, i, 1))
ret = ret & Hex(w \ 16)
ret = ret & Hex(w Mod 16)
'Debug.Print Format(i, "000") & " : " & Hex(w \ 16) & Hex(w Mod 16)
ret = ret & " "
Next i
Debug.Print ret
End Sub
'~~~~~~~~~~~
    • good
    • 0
この回答へのお礼

素早い回答有難うございます。

Chr$(151)が、0を返すのは、Windowsで使用されていない文字のため、みたいです。

データの送受信ですが、MSCommのInputModeをバイナリに代えることで実現できました。

それでは、また。

お礼日時:2001/09/07 13:45

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

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

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

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

QVBのMSCommコントロールを使ってシリアル通信をしています。

VBのMSCommコントロールを使ってシリアル通信をしています。
データ受信時、90byteを超えたあたりで"??"(ASCIIコードで0x3Fが2回)が
挿入されたように受信されてしまいます。
前後のデータ関係をみると、2byteがデータ化けを起こしているわけでは
なく、"??"が間に挿入されたような形です。
"??"が挿入される位置も受信の度に違います。
もしこのような現象の理由がわかる方がいらっしゃいましたら
回避策をお教えください。

<詳細設定>
38.4kbps、データ長:7、パリティ:Even、Stop bit :1 の設定。
http://www.compass-lab.com/STK_CAN/USB_Serial/USB_COMi.htm
にあるUSB-comiでシリアルポートを追加してRS422変換しています。
データ長129byteのデータが250ms周期で送られてくるのを
読み取ろうとしています。

Aベストアンサー

> 送信信号は問題無いのを確認しているため、
> RS422-USB変換器が悪さしているのか、、、

確認するには他の通信ソフトを使用して、受信してみてはいかがでしょうか。

Acknowrich
http://www.vector.co.jp/soft/win95/prog/se089304.html

このようなソフトで受信してみて、同じ現象だったら入力側(送信データかRS422)の問題、正しく受信できたら開発されたソフトの問題ということになります。

まず、この切り分けをしてから原因を追究した方が楽かと思います。

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

QVB6 API LISTVIEW(チェックボックス付き)にチェックを付けたい

CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。

Form1のソース

Option Explicit

Private Sub Form_Load()

Dim lngRet As Long
Dim lvcol As LV_COLUMN
Dim rStyle As Long
Dim item As LV_ITEM

'-- リストビューの作成
hList = CreateWindowEx(WS_EX_CLIENTEDGE, _
WC_LISTVIEW, "", _
WS_CHILD Or WS_VISIBLE Or WS_BORDER Or _
WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _
LVS_REPORT, _
0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX, 200&, _
Me.hwnd, _
0&, _
App.HINSTANCE, _
ByVal 0&)

'拡張スタイルを設定
rStyle = rStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_CHECKBOXES
SendMessageByNum hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle

'-- カラムヘッダーの追加
With lvcol

.mask = LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM
.fmt = LVCFMT_LEFT
.cx = 100
.pszText = "名前"
.iSubItem = 0
lngRet = ListView_InsertColumn(hList, 0&, lvcol)

End With

'-- リストアイテムの追加
With item

.mask = LVIF_TEXT Or LVIF_IMAGE

' 1つめ
.pszText = "山田 太郎"
.iItem = 0
.iSubItem = 0
.iImage = 0
lngRet = ListView_InsertItem(hList, item)

' 2つめ
.pszText = "山田 花子"
.iItem = 1
.iSubItem = 0
.iImage = 1
lngRet = ListView_InsertItem(hList, item)

End With

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'-- リストビューを破棄
DestroyWindow hList
End Sub

標準モジュールは補足に書きます

CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。

Form1のソース

Option Explicit

Private Sub Form_Load()

Dim lngRet As Long
Dim lvcol As LV_COLUMN
Dim rStyle As Long
Dim item As LV_ITEM

'-- リストビューの作成
hList = CreateWindowEx(WS_EX_CLIENTEDGE, _
WC_LISTVIEW, "", _
WS_CH...続きを読む

Aベストアンサー

LVITEMのstateMaskとstateメンバを適切に設定してLVM_SETITEMSTATEメッセージを送ればいいようです

Pubic Sub ListView_SetCheckState( hWnd as long, n as long, bflag as integer)
Const LVM_SETITMSTATE = (LVM_FIRST + 43)
  dim oItem as LVITEM
  dim bit as integer
  if bflag then
    bit = &h2000
  else
    bit = &h1000
  end if
  oItem.stateMask = &HF000
  oItem.state = bit

  SendMessage hWnd, LVM_SETITEMSTATE, n, oItem
End Sub

チェック状態の取得は
Pubic Function ListView_GetCheckState( hWnd as long, n as long ) as integer
  Const LVM_GETITMSTATE = (LVM_FIRST + 44)
  dim state as long
  state = SendMessage( hWnd, LVM_GETITEMSTATE, n, &HF000) / 4096
  ListView_GetCheckState = state - 1
End Function

といった具合だと思います

LVITEMのstateMaskとstateメンバを適切に設定してLVM_SETITEMSTATEメッセージを送ればいいようです

Pubic Sub ListView_SetCheckState( hWnd as long, n as long, bflag as integer)
Const LVM_SETITMSTATE = (LVM_FIRST + 43)
  dim oItem as LVITEM
  dim bit as integer
  if bflag then
    bit = &h2000
  else
    bit = &h1000
  end if
  oItem.stateMask = &HF000
  oItem.state = bit

  SendMessage hWnd, LVM_SETITEMSTATE, n, oItem
End Sub

チェック状...続きを読む

QVB2008かVB2005で、チェックボックスをループ文を使ってFalseにしたい

Visual Basic 2008か2005で
グループボックス1に50個、
グループボックス2に25個ののチェックボックスがあるとします。
これらのうち、グループボックス1の50個のチェックボックスだけ
全てチェックを外す処理を作りたいのですが、
1個1個チェックボックスをFalseにする文を記述すると
同じ様なソースが増えてしまうので、
Forのようなループを使って簡潔に書くことは出来ないでしょうか?

出来れば、ソースを記述してほしいです。
すみませんがよろしくお願いします。

Aベストアンサー

こんにちは、

グループボックス1に、チェックボックスのみ50個しかないと
仮定すると(グループボックス1にテキストボックス等などの
コントロールが他にない)

以下のコードで出来そうです。

Dim o As Object

For Each o In Me.GroupBox1.Controls

o.CheckState = 1


Next


すべてのチェックボックスをオンの時
o.CheckState = 1
オフの時
o.CheckState = 0

ちなみに、グループボックスの数は、今回は、関係ないです。
グループボックス、全部オンにするか、オフにするかになります。

Q【VB6】 変数1 = 変数1 Or $H2

他の人が作ったプログラムの修正を行っていたところ、下記のような記述がありました。
このような Or や And の使われ方はどのようなことを意味するのでしょうか?
(gStatusはintegerです。)

記述(1)
gStatus = gs_Status Or &H2

記述(2)
If (gStatus And &H2) = &H2 Then
'処理
End IF


宜しくお願い致します。

Aベストアンサー

&H2は、16進数の「2」をあらわします。
ご質問のケースでは、BIT1の状態を制御、確認しています。
記述(1)
gs_Status のBIT1をONしている。
記述(2)
gs_Status のBIT1がONか、どうか判断している。
(gs_Status をBIT1でマスク(BIT1の情報のみを抽出))し、
BIT1と比較している。
16進数・2進数・論理演算を学習されては?
http://f1.aaa.livedoor.jp/~zahyou/oldvb/ronri.htm
http://www5b.biglobe.ne.jp/~yone-ken/VB/BinHexDec.html
http://www5b.biglobe.ne.jp/~yone-ken/VB/BinHexDec2.html


このカテゴリの人気Q&Aランキング

おすすめ情報