当前位置:文档之家› VB调试题解答(07-3-17)

VB调试题解答(07-3-17)

VB调试题解答(07-3-17)
VB调试题解答(07-3-17)

第四部分:上机程序调试题(改错或填空)

(一)说明

等级考试上机测试的程序调试题常常是在考生目录中给出一个标准模块程序Modify.BAS,要求根据题意修改该模块中的函数或过程,为检测所作修改是否正确,可以按照以下操作步骤进行调试:

1.要求学生建立一工程,将这一模块添加到工程中。如果你是通过双击标准模块程序Modify.BAS进入Visual Basic程序设计系统的,则首先需要添加一个窗体模块。

2.将该标准模块程序Modify.BAS代码中用---n---(n为1,2,3,4,5)部分删除后改为合适的内容或将用****错误n****标示的下一语句中的错误改正,并在窗体模块中编写代码(常常写在窗体的Click()事件中)调用标准模块中的sub过程或自定义函数(如果在标准模块程序中有多个过程或函数,要注意调用的先后顺序,否则得不到正确结果),调试运行程序,使其能输出正确结果。

3.按试题要求保存工程。

(二)程序调试题

[题1] Modify.bas模块中的Transfer过程用于将一个十六进制整数转换为十进制整数;number函数过程用于将一个十六进制符号转换为数值。

Public Sub Transfer()

Dim Hex As String '十六进制数

Dim Dec As Double '十进制数

Dim temp As String

Dim i As Integer

Dim n As Integer

Hex = InputBox("输入一个十六进制整数")

'****** 错误1 *******

n = Val(Hex)

‘n=len(Hex)

i = 0

Do

'****** 错误2 *******

temp = Mid(Hex, i, 1)

‘temp=Mid(Hex,n-i,1)

'****** 错误3 *******

Dec = Dec + number * 16 ^ i

Dec=Dec+number(temp)*16^i

i = i + 1

Loop While i < n

'****** 错误4 ******

Form1.Print str(Hex) & "转换为十进制数为" & str(Dec)

‘Form1.print Hex & “转换为十进制数为” & str(Dec)

End Sub

Public Function number(str As String) As Integer

Select Case str

Case "a", "A"

number = 10

Case "b", "B"

number = 11

Case "c", "C"

number = 12

Case "d", "D"

number = 13

Case "e", "E"

number = 14

Case "f", "F"

number = 15

Case Else

number = Val(str)

End Select

End Function

[题2] Modify.bas模块中的BubbleSort过程是冒泡排序法;GenerateData过程产生个[1,20]之间互不相同的随机整数;Swap过程交换两个变量的数值。

Private Const n = 10

Private a(1 To n) As Integer

'BubbleSort过程是冒泡排序

'Swap过程交换两个变量数值

'GenerateData过程产生10个[1,20]之间互不相同的随机整数

Public Sub BubbleSort()

Dim i As Integer, j As Integer

i = 1

Do

For j = i + 1 To n

If a(j) > a(i) Then

'******* 1 *********

Swap (a(j), a(i))

‘.Swap a(j),a(i)

End If

Next j

i = i + 1

'******* 2 *******

Loop While i = n

‘Loop while i

Form1.Print "排序结果"

For i = 1 To n

Form1.Print a(i);

Next i

End Sub

Public Sub GenerateData()

Dim i As Integer

Dim j As Integer

Dim b As Boolean

For i = 1 To n

b = False

Do While Not b

a(i) = Int(20 * Rnd + 1)

b = True

'****** 3 ******

For j = 1 To i

‘for j=1 to i-1

If a(i) = a(j) Then

b = False

Exit For

End If

Next j

Loop

Form1.Print a(i)

Next i

End Sub

'******** 4 ********

Public Sub Swap(ByVal a As Integer, ByVal b As Integer)

‘Public Sub Swap(a as integer,b as integer)

Dim temp As Integer

temp = a

a = b

b = temp

[题3] Modify.bas模块中的wrap过程用于判断一个字符串是否“回文”。所谓“回文”是指字符串顺读与倒读都是一样的,如“潮起潮落,落潮起潮”。

Public Sub Wrap()

Dim length As Integer

Dim str1 As String

Dim strleft As String

Dim strright As String

Dim k As Integer

str1 = InputBox("请输入任意的字符串") '输入任意字符串

'****错误1*****

length = Val(str1)

‘length=len(str1)

k = 1

Do

'****错误2*****

strleft = Left(str1, k) '从左边起逐个取出一个字符

‘strleft= mid(str1,k,1)

'****错误3*****

strright = Right(str1, k) '从右边起逐个取出一个字符

‘strright= mid(str1,length-k+1,1)

'****错误4****

If strleft = strright Then

‘If strleft<> strright Then

Exit Do

End If

k = k + 1

Loop While k <= length / 2

If k > length / 2 Then

Form1.Print str1 & "是回文"

Else

Form1.Print str1 & "不是回文"

End If

[题4] Modify.bas模块中的MaxLine过程用于查找一个5行4列的二维数组中行平均值最大的行,并将该行所有数据调整到第一行的位置。Modify.bas模块中的DataProduce过程用于产生原始数据;Average过程用于计算各行的平均值;PrintArraay过程用于打印二维数组和行平均值。

Dim a(1 To 5, 1 To 4) As Integer

Dim ave(1 To 5) As Integer

Public Sub MaxLine()

Dim i As Integer

Dim j As Integer

Dim temp As Integer

Dim Line_no As Integer '最大平均值的行号

'找出最大平均值所在行

Line_no = 1

For i = 2 To 5

'****** 错误1 *******

If ave(Line_no) >= ave(i) Then

‘If ave(Line_no)

'****** 错误2 *******

Line_no = ave(i)

‘Line_no=i

End If

'交换第一行与最大平均值所在行

For j = 1 To 4

temp = a(1, j)

'****** 错误3 ******

a(Line_no, j) = a(1, j)

‘a(1,j)=a(Line_no,j)

a(Line_no, j) = temp

Next j

'交换对应行的平均值

temp = ave(1)

ave(1) = ave(Line_no)

ave(Line_no) = temp

'打印交换后的数据

Form1.Print "交换后的数据和平均值" PrintArray

End Sub

Public Sub DataProduce()

Dim i As Integer

Dim j As Integer

'产生5*4数组

For i = 1 To 5

For j = 1 To 4

a(i, j) = Int(100 * Rnd)

Next j

Next i

End Sub

Public Sub Average()

Dim i As Integer

Dim j As Integer

Dim sum As Integer

'计算各行平均值

For i = 1 To 5

sum = 0

For j = 1 To 4

'****** 错误4 ******

sum = a(i, j)

‘sum=sum+a(i,j)

Next j

ave(i) = sum / 4

Next i

'将数组和平均值打印出来

Form1.Print "原始数据和平均值"

PrintArray

End Sub

Public Sub PrintArray()

Dim i As Integer

Dim j As Integer

For i = 1 To 5

For j = 1 To 4

Form1.Print a(i, j); Spc(3); Next j

Form1.Print "平均值="; ave(i)

Next i

[题5] Modify.bas模块中的TJ过程是将一批数据中小于零的数及它们的积打印出来,但不完整,请在横线上填入必要的内容,使其完整。Modify.bas模块中的SCSJ过程是产生数据,数据的取值范围为-10~10之间的随机数。Private Const n = 10

Private a(1 To n) As Integer

'TJ过程是将一批数据中小于零的数及它们的积打印出来

'数据由SCSJ过程产生,数据的取值范围为-10 ~ 10 之间的随机整数数

Public Sub TJ()

Dim i As Integer

Dim t As Single

-------- 1 -------- t=1

For i = 1 To 10

If -------- 2 -------- a(i)<0 Then

t = t * a(i)

End If

Next i

Form1.Print "T="; t

End Sub

Public Sub SCSJ()

Randomize

Form1.Print "原始数据"

Dim i As Integer

Dim j As Integer

For i = 1 To n

'随机产生0或1,为0时取负,为1时取正

j = Int(Rnd * 2)

If ------ 3 ----- j=0Then J = -1

a(i) = j * Int(Rnd * (n + 1))

Form1.Print a(i);

Next i

Form1.Print

End Sub

[题6] Modify.bas模块中的calculate过程是产生100个[0,99]范围内的随机整数,统计个位上的数字分别为

1,2,3,4,5,6,7,8,9,0的数的个数并打印出来.

Public sub calculate()

Dim a(1 to 100) as integer

Dim x(1 to 10) as integer

Dim I as integer,p as integer

‘产生100个[0,99]范围内的随机整数

‘每行10个打印出来

for I=1 to 100

‘**********1**********

a(i)=rnd*100

‘a(i)=int(Rnd*100)

if a(i)<10 then

form1.print space(2);a(i)

else

form1.print space(1);a(i);

endif

if I mod 10=0 then form1.print

next I

‘统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数

‘并将统计结果保存在数组x(1),x(2),……,x(10)中,将统计结果打印出来

for I=1 to 100

‘**********2**********

p=int(a(i)/10) ‘求个位上的数字

p=a(i) mod 10

if p=0 then p=10

‘**********3**********

x(p)=x(p)-1

x(p)=x(p)+1

next I

form1.print “统计结果”

for I=1 to 10

p=I

if I=10 then p=0

‘**********4**********

form1.print “个位数为”+str(p)+”共“+str(x(p))+”个”

Form1.print “个位数为”+str(p)+”共”+str(x(i))

next I

[题7] Modify.bas模块中的PrintArray过程是用于打印一个5行5列的数字方阵,并使两对角线上元素均为1,其余均为2。要求打印的数字方阵两列数字之间空3格,两行之间空一行。

Public Sub PrintArray()

'下面程序用于打印5行5列的数字方阵

'使两对角线上元素均为1,其余均为2

'要求打印的数字方阵两列数字之间空3格,两行之间空一行

'只要修改标出出错位置的下面那一条语句

Dim a(5, 5) As Integer

Dim i As Integer, j As Integer

For i = 1 To 5

For j = 1 To 5

'******** 错误1 *********

If i <> j Or i <> 6 - j Then

If i<>j and i<>6-j then

a(i, j) = 2

Else

a(i, j) = 1

End If

'******** 错误2 *********

Form1.Print a(i, j) + Space(3);

Form1.print a(I,j);space(3);

Next j

'******* 错误3 *******

Form1.Print

form1.print :form1.print

Next i

[题8] Modify.bas模块中的Guess过程是猜数游戏,由计算机产生一个[1,100]的任意整数,输入猜数后计算机给出提示,如果5次后还没有猜中就结束游戏并公布正确答案,请改正其中的错误。说明:只要修改标出出错位置的下面那条语句。

Public Sub Guess()

Dim R As Interger

Dim X As Integer

Dim time As Integer

Randomize

----1----

R=Rnd*100 '产生一个1—100的任意整数

R=int(rnd*100)+1

Times=1

Do

X=Val(InputBox("输入猜数X")

Select Case X

Case R

Form1.Print "猜中了"

Exit Do

----2----

Case X>R

Case Is>R

Form1.Print "太大了,继续猜!"

Case Else

Form1.Print "太小了,继续猜!"

End Select

Times=times+1

----3----

Loop While times>5

Loop until times>5

If times>5 Then

Form1.Print "猜数失败,游戏结束!"

----4----

Form1.Print "正确答案为" & Str(x)

Form1.print “正确答案为”& str(r)

End If

[题9] Modify.bas模块中的Findat过程是用于在一个字符串变量中查找”at”,并用消息框给出查找结果的报告:没有找到或找到的个数。

Public Sub Findat()

'在字符串str1中查找"at"

Dim str1 As String

Dim length As Integer '字符串长度

Dim sum As Integer '查到的个数

Dim i As Integer

str1 = InputBox("请输入一个字符串")

length = ----1---- Len(str1)

i = 1

sum = 0

Do While i <= ----2---- length-1

If ----3---- mid(str1,I,2) = "at" Then

sum = sum + 1

End If

i = i + 1

Loop

If ----4---- sum=0 Then

MsgBox "没有找到!"

Else

MsgBox "找到了" & Str(sum) & "个"

End If

[题10] 本程序从键盘上输入一个任意的字符串,将该字符串的所有组成字符拆分开,再按照字符ASCII码从小到大的顺序将这些字符重新组成新的字符串。例如输入a4fkze5,重新组合的字符串为45aefkz。请在横线上填入出境必要

的内容。

Option Explicit

Public Sub sortchar()

Dim x As String '原始字符串

Dim y As String '重新组合的字符串

Dim c() As String '拆分出的字符

Dim l as Integer '字符串长度

Dim I as Integer , j As Integer

Dim temp As String

X=InputBox("输入一个字符串")

L=------1------ len(x)

ReDim c(1) As String

'字符串拆分

For I=1 to l

C(i)=------2------ mid(x,i,1)

Next I

'字符排序

For I=1 to l-1

For j=------3------ i+1 to l

If c(i)>c(j) Then

Temp=c(i)

C(i)=c(j)

C(j)=temp

End If

Next j

Next I

'排序后的字符组成新字符串

y=""

For I=1 to l

------4------ y=y & c(i)

Next I

Form1.Print "原始字符串" ; x

Form1.Print "重新组合的字符串" ; y

End Sub

[题11] sum过程用于计算f=1-1/(2*3)+1/(3*4)-1/(4*5)+……+1/(19*20),请在横线上填入必要的内容。

Option Explicit

Public Sub sum()

Dim f As Single

Dim i As Integer

Dim sign As Integer

'------1------ sign=-1

f = 1

'------2------ for I=2 to 19

f = f + sign / (i * (i + 1))

'------3------ sign=-sign

Next i

Form1.Print "f="; f

End Sub

[题12] 有一个数列,它的前三个数是0,1,2,从第四个数起,每个数都是它前面的两个数之和(斐邦纳契数列),过程Fabonia用于求出该数列的第17个数是多少?求出该数列的第几个数起每个数都超过1E+8?请在横线上填入必要的内容。

Option Explicit

Public Sub Fabonia()

Dim last_one As Long

Dim last_two As Long

Dim this_one As Long

Dim i As Integer

last_one = 1 '数列的第二个数

last_two = 2 '数列的第三个数

i = 4 '从数列的第四个数求起

Do

this_one = last_one + last_two

'------1------ last_one=last_two

'------2------ last_two=this_one

If i = 17 Then

Form1.Print "No:17="; this_one

End If

'------3------ i=i+1

Loop While this_one <= 100000000#

Form1.Print "No:"; '------4------ i-1 ; is > 1E+8

End Sub

[题13] 以下程序完成下列功能:随机产生9个[1-100]的整数数组,并按从小到大的顺序进行排序,从键盘输入一个正数,找到该数在原来9个数中的插入点,使得该数插入数组后,数组的10个数依然是从小到大的顺序。请在横线上填入必要的内容。

Option Explicit

Public Sub Insert()

Dim x(10) As Integer

Dim i As Integer, j As Integer

Dim temp As Integer

Dim ins As Integer, pos As Integer

'随机产生9个1--100的整数并排序

Randomize

For i = 1 To 9

'------1------ x(i)=int(rnd*100+1)

Next i

For i = 1 To 8

For j = i + 1 To 9

If x(i) > x(j) Then

temp = x(i)

x(i) = x(j)

x(j) = temp

End If

Next j

Next i

'输出排序后数组

For i = 1 To 9

Form1.Print x(i); " ";

Next i

Form1.Print

'从键盘输入一个正数

Do

ins = Val(InputBox("ins="))

Loop Until ins > 0

'将输入的数插入数组中

pos = 1

For i = 1 To 9

'------2------ if x(i)>ins then exit for

pos = i + 1

Next i

For j = 9 To pos Step -1

'------3------ x(j+1)=x(j)

Next j

'------4------ x(pos)=ins

'输出插入后数组

For i = 1 To 10

Form1.Print x(i); " ";

Next i

Form1.Print

End Sub

[题14] 餐厅发工资程序。Modify.bas模块中的Money过程是用于统计一个有7个工作人员的餐厅发工资所需的100元、50元、10元、5元和1元的票面数。Modify.bas模块中的SalaryData过程是给出7个员工的工资。

Dim salary(7) As Integer

Public Sub Money()

Dim hundred As Integer, totalhundred As Integer '100元票面数量、总数量

Dim fifty As Integer, totalfifty As Integer '50元票面数量、总数量

Dim ten As Integer, totalten As Integer '10元票面数量、总数量

Dim five As Integer, totalfive As Integer '5元票面数量、总数量

Dim one As Integer, totalone As Integer '1元票面数量、总数量

Dim totalsalary As Integer '工资总计

Dim i As Integer, temp As Integer

totalhundred = 0

totalfifty = 0

totalten = 0

totalfive = 0

totalone = 0

totalsalary = 0

For i = 1 To 7

temp = ----1---- salary(i)

hundred = Int(temp / 100)

temp = ----2---- temp mod 100

fifty = Int(temp / 50)

temp = temp - fifty * 50

ten = Int(temp / 10)

temp = temp - ten * 10

five = Int(temp / 5)

temp = temp - five * 5

one = ----3---- temp

totalhundred = totalhundred + hundred

totalfifty = totalfifty + fifty

totalten = totalten + ten

totalfive = totalfive + five

totalone = totalone + one

totalsalary = ----4---- totalsalary+salary(i)

Next i

Form1.Print "共需100元" & Str(totalhundred) & "张"

Form1.Print "共需50元" & Str(totalfifty) & "张"

Form1.Print "共需10元" & Str(totalten) & "张"

Form1.Print "共需5元" & Str(totalfive) & "张"

Form1.Print "共需1元" & Str(totalone) & "张"

Form1.Print "合计" & Str(totalsalary) & "元"

End Sub

Public Sub SalaryData()

salary(1) = 1398

salary(2) = 1765

salary(3) = 689

salary(4) = 1500

salary(5) = 832

salary(6) = 590

salary(7) = 1200

[题15] 改错。

Option Explicit

Public Sub prt()

'打印由数字组成的如下所示金字塔图案

' 9

' 888

' 77777

' 6666666

' 555555555

' 44444444444

' 3333333333333

' 222222222222222

' 11111111111111111

Dim i As Integer, j As Integer

'****** 错误1 ******

For i = 9 To 1

for i=9 to 1 step –1

Form1.Print Space(i);

'****** 错误2 ******

For j = 1 To 2 * i – 1

for j=1 to 2*(9-i+1)-1

'****** 错误3 ******

Form1.Print i

form1.print trim(str(i));

Next j

Form1.Print

Next i

[题16] Modify.bas模块中的ArmstrongNumber过程是用于求出1—999之间所有的Armstrong数,并打印出来。所谓Armstrong数是指一个数等于它每位上数字的立方和。

Public Sub ArmstrongNumber()

Dim armstrong As Integer

Dim i As Integer

Dim hundred As Integer '百位上的数字

Dim ten As Integer '十位上的数字

Dim one As Integer '个位上的数字

For i = 1 To 999

hundred = ----1---- i\100

ten = ----2----(I mod 100)\10

one = ----3----(i mod 100) mod 10

If ----4---- i=hundred^3+ten^3+one^3Then

Form1.Print i; "is armstrong number"

End If

Next i

[题17] 过程Uppersen实现从键盘上任意输入一条英文句子,将句子中的每个单词的首字母都变成大写例如:输入I am a good student. 要求输出 I Am A Good Student.

Public Sub Uppersen()

Dim oldsen As String, newsen As String

Dim char As String, lastchar As String

Dim l As Integer, i As Integer

oldsen = InputBox("请输入英文句子:")

'------1------ l=len(oldsen)

'以空格作为单词的界定,空格后的字母转换为大写字母

'------2------ lastchar=””

For i = 1 To l

char= '------3------ mid(oldsen,i,1)

If lastchar = "" Then

char= '------4------ ucase(char)

End If

newsen = newsen & char

lastchar = char

Next i

Form1.Print "input:"; oldsen

Form1.Print "output:"; newsen

End Sub

[题18] 过程DtoB采用连除2取余数的方法实现将一个十进制数转换为二进制数,但不完整,请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。

Public Sub DToB()

Dim Dec As Integer '输入一个十进制数

Dim Bin As String '转换为二进制表示

Dim res As Integer

Dim i As Integer

Dec = Val(InputBox("x="))

Form1.Print "十进制数:"; Dec

Do

res= '------1------ dec mod 2'求出除以2的余数

Bin= '------2------ str(res)+bin

Dec= '------3------ dec\2

Loop While '------4------ dec<>0

Form1.Print "转换为二进制数为:"; Bin

End Sub

[题19] 过程same用以找出1—100之间所有的同构数。所谓同构数是指一个数出现在它的平方数的右端,如25在25平方625的右端,则25为同构数。利用数字转字符再取出右端字符的方法进行判断。

Public Sub same()

Dim i As Integer

Dim x As String, x2 As String

For i = 1 To 1000

x1= '------1------ trim(str(i))' 将i转字符型

x2= '------2------ trim(str(I^2)) ' 将i^2转字符型

if '------3------ x1=right(x2,2) Then

Form1.Print i; "是同构数"

End If

Next i

[题20] 过程ComDiv用以实现求任意两个正整数的最大公约数,请改正其中的错误。说明:只要修改标出出错位置的下面那条语句。

Public Sub ComDiv()

Dim m As Integer, n As Integer '任意两个正整数

Dim i As Integer

Dim div As Integer '最大公约数

'输入两个正整数,要求m与n都必须大于零

Do

m = Val(InputBox("m="))

n = Val(InputBox("n="))

'****** 错误1 ******

Loop While m <= 0 And n <= 0

loop while m<=0 or n<=0

'先将两个整数中的较小数假设为最大公约数,再依次往下

'寻找能同时除尽m和n的数即为最大公约数

'****** 错误2 ******

div = 0

div=m

If n < m Then

div = n

End If

'****** 错误3 ******

Do While m Mod div = 0 And n Mod div = 0

do until m mod div=0 and n mod div=0

'****** 错误4 ******

div = div + 1

div=div-1

Loop

Form1.Print m; "和"; n; "的最大公约数是:"; div

[题21] 过程DelRepeat实现以下功能:产生一个由50个10—99的随机整数组成的数组,整理数组,要求将数组中与前面数组元素重复的数据删除,只保留第一次出现该数据的数组元素,将整理后数组输出。请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。

Public Sub DelRepeat()

Dim x(50) As Integer

Dim i As Integer, j As Integer

Dim count As Integer '整理后数组元素个数

'产生数组并输出

Randomize

For i = 1 To 50

x(i)= '------1------ int(90*rnd)+10

Next i

Form1.Print "原始数据:"

For i = 1 To 50

Form1.Print x(i); Space(2);

If i Mod 10 = 0 Then Form1.Print

Next i

'从第二个数组元素起逐个判断该数组元素是否与前面的数组元素数据重复

'对重复的数据进行删除操作

count = 50

i = 2

Do

For j = 1 To i - 1

If '------2------ x(j)=x(i)Then

Exit For

Next j

If j = i Then

'------3------ i=i+1

Else

For j = i + 1 To count

x(j - 1) = x(j)

Next j

'------4------ count=count-1

End If

Loop While '------5------ while I<=count

Form1.Print "整理后数据:"

For i = 1 To count

Form1.Print x(i); Space(2);

If i Mod 10 = 0 Then Form1.Print

Next i

End Sub

[题22] 过程even用以验证一个偶数可以分解为两个素数之和;Isprime用以判断x是否是素数。请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。

Public Sub even()

'从键盘输入一个大于4的偶数,将它所有的不重复的分解式求出

Dim x As Integer

Dim i As Integer

'------1------ do while x<4 or x mod 2<>0'保证x是大于4的偶数

x = Val(InputBox("x="))

Loop

For i = 3 To x / 2 Step 2 '在不大于x的奇数中找素数

'------2------ if isprime(i) and isprime(x-i)

Form1.Print x; "="; i; "+"; x - i

End If

Next i

End Sub

Public Function Isprime(x As Integer) As Boolean

Dim i As Integer

'------3------ isprime=true

For i = 2 To x - 1

'------4------ if x mod I=0 then

Isprime = False

Exit For

End If

Next i

[题23] 打印输出一菱形图案。

Public Sub prt()

'打印由#组成的菱形图案

' #

' ###

' #####

' #######

' #########

' #######

' #####

Dim i As Integer, j As Integer

Dim start As String '每行起始空格数

Dim count As Integer '每行#个数

For i = 1 To 9

If i <= 5 Then

'------1------ start=space(21-i)

count = 2 * i - 1

Else

start = Space(11 + i)

'-------2------ count=19-2*i

End If

'------3------ form1.print start;

For j = 1 To count

Form1.Print "#";

Next j

'------4------ form1.print

Next i

End Sub

[题24] 计算s=7+77+777+……+(n个7组成的数)。

Public Sub total()

'计算s=7+77+777+……+(n个7组成的数)

Const n = 20

Dim s As Single

Dim i As Integer

For i = 1 To n

s=s+ '-------1------ number(i)

Next i

Form1.Print "s="; s

End Sub

Public Function number( '------2------- n as integer ) As Single

Dim i As Integer

number = 0

For i = 1 To n

'------3------ number=number*10+7

Next i

End Function

[题25] 在考生目录中,已有模块文件Modify.bas。Modify.bas模块中的CountTo60过程是用于从一堆一分、二分、五分的硬币中取出20枚,使其总值为60分,要求输出取法的数量及每一种取法的一分、二分、五分的个数。请建立工程将Modify.bas模块加入工程中进行调试。注意:只要修改标出出错位置的下面那一条语句即可,其余代码不要改动。

'从一堆一分、二分、五分的硬币中取出20枚,使其总值为60分

'输出取法的数量及每一种取法的一分、二分、五分的个数

Dim one As Integer '一分硬币个数

Dim two As Integer '二分硬币个数

Dim five As Integer '五分硬币个数

Const n = 20 '总数20枚

Dim k As Integer '取法数量

k = 0

For one = 1 To n

'******* 错误1 ********

For two = one + 1 To n

for two=1 to n-one

five = n - one - two

'******* 错误2 *********

If one + two + five = 60 Then

if one+two*2+five*5=60 then

k = k + 1

Form1.Print "one="; one; "two="; two; "five="; five

End If

'******* 错误3 ********

Next one

next two

'****** 错误4 ******

Next two

Next one

Form1.Print "k="; k

[题26] Modify.bas模块中的Transpose过程用于产生一个转置矩阵(所谓转置是指将二维数组中所有行和对应列的元素进行交换)。Modify.bas模块中的Swap过程用于交换两个变量的值。

Public Sub Transpose()

'产生一个6×6的转置矩阵,将二维数组中所有行和对应列的元素进行交换

Dim a(1 To 6, 1 To 6) As Integer

Dim i As Integer, j As Integer

Form1.Print "原始数据"

For i = 1 To 6

For j = 1 To 6

a(i, j) = Int(Rnd * 10)

Form1.Print a(i, j);

Next j

Form1.Print

Next i

For i = 2 To 6

For j = 1 To ----- 1 ----- i –1

------ 2 ----- swap a(I,j),a(j,i)

Next j

Next i

Form1.Print "转置后数据"

For i = 1 To 6

For j = 1 To 6

----- 3 ----- form1.print a(i,j);

Next j

Form1.Print

Next i

End Sub

Public Sub Swap(a As Integer, b As Integer)

Dim temp As Integer

temp = a

a = b

b = temp

[题27] 过程cloze用以求1~1000中的所有完数。所谓完数是指一个数的所有因子之和等于其自身。请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。

Option Explicit

Dim a(50) As Integer '存放每个数分解出来的因子

Public Sub cloze()

'求1--100中的所有完数

Dim i As Integer, j As Integer

Dim n As Integer '因子个数

Dim s As Integer '因子和

For i = 1 To 1000

n = 0

s = 0

factor '-------1------ factor i,n

For j = 1 To n

s = s + a(j)

Next j

'-------2------ if i=s then

Form1.Print i

End If

Next i

End Sub

Public Sub factor(ByVal x As Integer, ByRef k As Integer)

Dim i As Integer

a(1) = 1

k = 1

'------3------ for I=2 to x

If x Mod i = 0 Then

k = k + 1

'------4------ a(k)=i

End If

Next I

[题28] 过程Del实现以下功能:产生10个[1,100]的随机整数,从键盘上输入一个数,将该数从数组中删除。请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。

Option Explicit

Public Sub Del()

Randomize

Dim x As Integer

Dim a() As Integer

Dim i As Integer, pos As Integer

ReDim a(10) As Integer

For i = 1 To 10

a(i)= '------1------ int(rnd*100)+1

Next i

Form1.Print "原始数据:"

For i = 1 To 10

Form1.Print a(i); " ";

Next i

Form1.Print

x = Val(InputBox("输入删除的数x="))

pos = 0

For i = 1 To 10

If x = a(i) Then

'------2------ pos=i

Exit For

End If

Next i

If pos <> 0 Then

For i= '------3------ pos To 9

'------4------ a(i)=a(i+1)

Next i

ReDim Preserve a(9)

Form1.Print "删除后数据:"

For i = 1 To 9

Form1.Print a(i); " ";

Next i

Form1.Print

Else

MsgBox "数组中未找到" & Str(x) & ",删除不成功"

End If

[题29] 过程pyramid用以打印一个数字金字塔,请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。

Option Explicit

Public Sub pyramid()

'打印数字金字塔

' 1

' 222

' 33333

' 4444444

' 555555555

' 6666666

' 77777

' 888

' 9

Dim i As Integer

Dim j As Integer

Dim start As String '每行起始空格数

Dim num As Integer '每行数字个数

For i = 1 To 9

If i <= 5 Then

start = Space(20 - i)

num = 2 * i - 1

Else

start= '------1------ start=space(10+i)

num= '------2------ num=19-2*i

End If

Form1.Print start;

For j = 1 To num

'------3------ form1.print trim(str(i));

Next j

'------4------ form1.print

Next i

[题30] Modify.bas模块中的SortData过程是产生10个[30,50]的随机整数并按照从小到大的顺序打印出来,Swap 过程用于交换两个变量的值。

Public Sub SortData()

'产生10个[30,50]的随机整数,并按从小到大的顺序打印出来

Dim a(10) As Integer

Dim i As Integer, j As Integer

For i = 1 To 10

a(i)= -------- 1 --------- int(rnd*21)+30

Next i

For i = 1 To 9

-------- 2 --------- for j=i+1 to 10

If a(i) > a(j) Then

--------- 3 ---------- swap a(i),a(j)

End If

Next j

Form1.Print a(i)

Next i

Form1.print --------- 4 -------- a(10)

End Sub

Public Sub Swap(a As Integer, b As Integer)

Dim temp As Integer

temp = a

a = b

b = temp

[题31] Modify.bas模块中的FindMax过程是用于查找一批数据中的最大数,并打印出最大数的值及最大数在数组中的下标值,但不完整,在横线上填入必要的内容,使其完整。Modify.bas模块中的GenerateData过程用于产生30个[1-500]之间的随机整数并5个一行打印出来。

Dim a(30) As Integer

Public Sub FindMax()

Dim Position As Integer '最大数在数组中的下标

Dim max As Integer '最大数

Dim i As Integer

GenerateData

max = ----1---- a(1)

Position = ----2----1

For i = 2 To 30

If a(i) > max Then

max = ----3---- a(i)

Position = ----4---- i

End If

Next i

Form1.Print "最大值=" & Str(max)

Form1.Print "最大值的下标=" & Str(Position)

End Sub

Public Sub GenerateData()

Dim i As Integer

For i = 1 To 30

a(i) = Int(500 * Rnd() + 1)

Form1.Print a(i),

If i Mod 5 = 0 Then Form1.Print

Next i

[题32] Modify.bas模块中的PrintArray过程是输出一个右上三角元素(含对角线)为1,其余元素为0的5×5矩阵,但不完整,请在横线上填入必要的内容,使其完整。

'输出一个右上三角元素(含对角线)为1,其余元素为0 的5×5矩阵

Public Sub PrintArray()

Dim a(1 To 5, 1 To 5) As Integer

Dim i As Integer, j As Integer

For i = 1 To 5

For j = 1 To 5

If ----- 1 ----- j>=i Then

----- 2 ----- a(I,j)=1

End If

Next j

Next i

For i = 1 To 5

For j = 1 To 5

Form1.Print " "; a(i, j);

Next j

------ 3 ----- form1.print

Next i

[题33] Modify.bas模块中的JiSuan过程是用于计算1-(1/2)+(1/3)-……+(1/99)-(1/100)的值并打印出来。

Public Sub JiSuan()

'计算1-(1/2)+(1/3)-...+(1/99)-(1/100)的值并打印出来

Dim i As Integer

'****** 错误1 *******

Dim k As Integer

dim k as single

Dim s As Single

s = 0

'******* 错误2 *******

For i = 1 To 100

for i=1 to 100 step 2

k = 1 / i

s = s + k

'******* 错误3 *******

k = 1 / i + 1

k=-1/(i+1)

s = s + k

Next i

Form1.Print "s="; s

[题34] Modify.bas模块中的Combination过程是用于计算m个数据中取出n个数据的排列组合值,计算公式为Cmn=m!/(n!*(m-n)!)。Modify.bas模块中的n过程是产生数据,数据的取值范围为-10~10之间的随机数。

Public Sub Combination()

Dim m As Integer

Dim n As Integer

Dim Cmn As Long

Do

m = Val(InputBox("请输入一个整数m"))

n = Val(InputBox("请输入一个整数n(n<=m)"))

'****** 错误1 ******

Loop While m >= n '必须保证输入的两个数m>=n

Loop until

'****** 错误2 ******

Cmn = nFactor(m) / nFactor(n) * nFactor(m - n)

cmn=nfactor(m)/(nfactor(n)*nfactor(m-n))

Form1.Print "排列组合数为"; Cmn

End Sub

Public Function nFactor(ByVal n As Integer) As Double

Dim i As Integer

Dim temp As Double

temp = 1

For i = 1 To n

temp = temp * i

Next i

VB串口通信源程序

[程序宝典]VB串口通讯实例 程序匠人 2005-9-22 14:23:00 阅读全文(3939) | 回复(0) | 引用(0) | 查看《匠人的百宝箱》代理商品 VB串口通讯实例 作者:liwenzhao 高精度电压表(24bit) VB源程序 Dim PortValue As Integer '端口号选择1-4 Dim value As Double '当前一次取值 Dim value2 As Double '要显示的值 Dim valueSum As Double '和 Dim numCount As Double '算平均值是的计数个数 Dim func As Integer '功能号标志1-4 Dim valueFlag As Integer /********************************************** ' Check1_Click()为控制Command1是否Enabled Private Sub Check1_Click() '自动刷新被选中则刷新按钮无效 If Check1.value Then Command1.Enabled = False Else Command1.Enabled = True Command1.SetFocus End If End Sub *********************************************/ /********************************************** Private Sub Command1_Click() '显示 Call display End Sub *********************************************/ Private Sub Command2_Click() '复位 valueSum = 0 '清计数和 numCount = 1 '清计数个数 Label6.Caption = Str(numCount - 1) '显示复位 value = 0 '当前一次取值 value2 = 0 '要显示的值 valueFlag = 0

VB 串口通信程序设计典型实例

VB 串口通信程序设计典型实例
利用 VB 开发串口通信程序既可以使用 MSComm 控件也可以调用 Windows API 函数实 现。不过,只要 MSComm 控件可以被选用,我们推荐选择此控件实现,因为 MSComm 控 件的功能和 API 调用一样强,甚至比它还好且使用起来更加简单。 在本章提供的串口通信程序设计中,除了 PC 与 PC 串口通信外,PC 与单片机、PC 与 智能仪表、PC 与 PLC、PC 与 GSM 短信模块等串口通信任务的实现均采用 MSComm 控件。
6.1 PC 与 PC 串口通信程序设计
当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需 3 根线 (发送线、接收线、信号地线)便可实现全双工异步串行通信。 本设计通过两台 PC 串口 3 线连接,介绍了利用 API 函数和 MSComm 控件设计串口通 信程序的方法,包括字符与文件的发送与接收。
6.1.1 PC 与 PC 串口通信程序设计目的
(1)掌握 PC 与 PC 串口通信的线路连接方法。 (2)利用 MSComm 控件和 API 函数实现 PC 与 PC 串口通信的程序设计方法。
6.1.2 PC 与 PC 串口通信程序设计用软、硬件
本设计用到的硬件和软件清单如表 6-1 所示。
表 6-1 序 1 2 3 号 PC 或 IPC 串口通信线(三线制) Visual Basic 6.0 设计用软、硬件 名 称 数 2 1 1 量
6.1.3 PC 与 PC 串口通信程序硬件线路图
线路说明,在计算机通电前,按图 6-1 所示将两台 PC 通过串口线连接起来:计算机 A 串口 COM1 端口的 TXD 与计算机 B 串口 COM1 端口的 RXD 相连, 计算机 A 串口 COM1 端 口的 RXD 与计算机 B 串口 COM1 端口的 TXD 相连, 计算机 A 串口 COM1 端口的 GND 与 计算机 B 串口 COM1 端口的 GND 相连。

用VB编写上位机

VB编写上位机实例 用VB编写上位机实例 16:14:22 UTC+0800Sun Apr 1 2007 用VB6.0编写第一个串口通信上位机程序 Visual Basic6.0是一个可视化窗口环境的编程软件,目前使用Visual Basic6.0可以快速简单编写单片机中的串口通信上位机程序。电子制作HPOO 下面我们以一个完整的通信试验为例子完成如何用Visual Basic6.0编写单片机串口通信程序。 打开安装好后的Visual Basic6.0主程序界面。选择“标准EXE”。如图1显示,建立Visual Basic 的编程环境。 图1 在菜单的[工程]选项中选择[部件],如图2。把Visual Basic的串口通信控件Microsoft Comm control 6.0调入工作菜单。 图2

在打开[部件]对话框中,选择Microsoft Comm control 6.0的选项框,点击[确定]。图3 图3 可以在图示3中可以看通信控件Microsoft Comm control 6.0的文件是在C:\WINNT\system32\MSCOMM32.OCX文件。 如果大家在首次调用通信控件Microsoft Comm control 6.0控件时无法在控件对话框中找到,请直接在系统目录中搜索名为MSCOMM32.OCX文件。然后通过浏览加入VB的工作界面中。添加完控件回到编程界面。如下图4。 图4 通过右边的菜单把一些必要的控件放在窗体中。然后点击窗体中的Timer控件按F4弹出属性窗口进行设置。其具体设置如下:

Timer定时器控件设置属性,(通过按F4键可弹出此窗口) Mscomm通信控件参数属性设置(通过单击控件的右键属性可弹出此窗口) 本文用到的其他控件:CommandButton控件和TextBox控件按默认属性设置不变。单片机编程器HPOO 以上设置完成,回到编程窗体区中,任意双击。会显示Visual Basic的程序窗体的Load事件程序。在代码窗口中输入:单片机编程器HPOO Private Sub Form_Load() MSComm1.PortOpen = True '窗体的加载时,就打开通信端口,通信端口的参数也可以在此指定 Timer1.Enabled = Timer1.Enabled '窗体的加载时,同时定时器控件事件 End Sub 这样设置目的是当程序在打开是,首先打开通信控件MSComm,注意这里的串口通信参数中的波特率设置是默认参数的。 即:波特率:9600bps;校验位:无;数据位:8位;停止位:1。电子元件邮购网 双击定时器控件Timer1同样在定时器窗体的事件程序中,输入相关代码: Private Sub Timer1_Timer() If MSComm1.InBufferCount > 0 Then '程序检查输入缓冲区中是否有数据,若有数据 Text1.Text = Text1.Text + MSComm1.Input

VBNET开发全功能串口调试助手

https://www.doczj.com/doc/a318176814.html,开发全功能串口调试助手(含完整工程) 小记:https://www.doczj.com/doc/a318176814.html,的串口通信用了很长时间了,也只用Write和Read这样的方法,以前都是用这种方式做上位机软件,如此足矣。而前几天研究GSM模块时对串口返回的数据总是把握不好,参考开发板附送的例程,发现采用SerialPort 的DataReceived事件,可以实现中断触发式的数据接收。于是想到要自己做一个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。经过断断续续的编写,就做成了下面这个小软件: 这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量数据接收。

https://www.doczj.com/doc/a318176814.html,的串口通信主要使用VS自带的SerialPort控件,而不是早先的MSComm,更具有兼容性,这也是很久以前就放弃VB改用.NET的直接原因。该控件的主要方法、属性如下(该数据来自VS的MSDN帮助库):

想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM1端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。打开串口可通过手动指定,也可以使用GetPortNames方法获取计算机中存在的串口。如果打开出错,则可能是串口不存在或者已被占用。下面是相应代码: Private Sub SerialPortOpen() On Error GoTo Err If SerialPort.IsOpen =True Then SerialPort.Close()'避免重复打开端口 SerialPort.Open() LabelCOMStatus.Text ="串口已打开" Exit Sub Err:MsgBox("串口不存在或已被占用!"+ vbNewLine + ErrorToString())'出现错误,显示错误信息 End Sub 如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码:SerialPort.Encoding = System.Text.Encoding.Default

基于vb的半双工串口调试软件设计

基于vb的半双工串口通信调试软件设计 一、任务 使用RS-485标准实现两台PC之间的半双工通信。 二、硬件概况 硬件设计如图1所示,由于目前多数电脑不带DB9通信接口,因此需要购买usb转R-S232转换头,并安装好相关驱动。此模块使用DB9接口的7脚(RTS端)作为485通信的数据收发控制端。 图1 使用max485和max232设计半双工通信硬件电路板 三、软件设计 1、界面设计 该程序有两个界面,主界面和设置界面。图2所示,是程序的主界面。图3所示,是通信参数设置界面。 图2 调试软件主界面

图3 设置界面2、变量及函数声明 Private tx As Integer ‘发送字符数 Private rx As Integer ‘接受字符数 Function addRx(X As Integer) rx = rx + X LabelRx.Caption = CStr(rx) End Function Function addTx(X As Integer) tx = tx + X LabelTx.Caption = CStr(tx) End Function Function clearRx() rx = 0 LabelRx.Caption = "0" End Function Function clearTx() tx = 0 LabelTx.Caption = "0" End Function 3、窗体加载与卸载 Private Sub Form_Load() 'MSComm1.PortOpen = True '打开串口 ' ss = False Combo1.Text = "COM1" With Combo1 .AddItem "COM1" .AddItem "COM2"

VB6.0环境下基于USB的虚拟串口通讯实现

VB6.0环境下基于USB的虚拟串口通讯实现 摘要:以ftdi公司的ft232bl芯片为核心设计并实现了基于usb 接口的计算机与单片机之间的虚拟串口通讯。单片机采用philips 公司p89系列单片机,完成数据的存储。计算机在windows环境下利用mscomm通讯控件实现上位机与下位机之间的数据传输。在此提出了pc机对虚拟串口的自动识别方法,并提供了程序的源代码。实验结果表明,用虚拟串口实现计算机与单片机之间的usb通信,具有速度快,软件实现简单等优点。 关键词:vb6.0; usb口; ft232bl;虚拟串口 引言 数据传输是现代通讯过程中的一个重要环节,在数据传输过程中,不仅要求数据传输的准确率要高,而且要求速度快、连接方便。传统的rs 232串口通讯和并口通讯都存在传输速度低、扩展性差、安装麻烦等缺点,而基于usb接口的数据传输系统能够较好地解决这些问题。目前,usb接口以其传输速率高、即插即用、支持热插拔等优点,逐步成为pc机的标准接口。 本文中的数据传输系统采用了usb接口进行上位机与下位机之间的数据通讯。下位机采用philips 公司p89系列单片机,完成数据的存储。上位机通过vb6.0编程,实现上位机与下位机之间的数据传输。 1数据传输系统的总体设计

系统的硬件部分主要包括2部分:上位机端和下位机端。上位机采用pc机或笔记本电脑,操作系统为windows xp,实现上位机和下位机之间的数据传输、显示、处理、存储及查询功能。系统的下位机采用philips公司p89系列单片机,完成数据的存储。下位机为一个手持的数据存储仪,由usb转串口数据转换模块、ttl转rs 422总线模块、中央处理模块、显示模块、存储模块、电源模块等组成。上位机与下位机的连接利用pc机自带的usb接口,原理框图如图1所示。 图1数据传输系统原理框图把数据记录卡插入数据存储仪内,可把卡内数据转存到存储模块。数据存储仪通过usb口与pc机连接,把所存数据传输到上位机,上位机对数据进行显示、处理及存储。系统采用ftdi公司的ft232bl芯片作为usb转串口模块,可以和单片机的内置串口直接连接,使单片机通过usb口和pc机通讯。芯片一方面可以接收从pc机发来的usb数据,并将其转换为串行i/o数据格式发送给单片机串口;另一方面可把单片机从串口发出的数据转换为usb的数据格式传回pc机。与其他usb接口芯片相比,用ft232bl芯片进行usb外设开发,只需熟悉单片机编程及简单的vc或vb 编程,而无需考虑固件设计以及驱动程序的编写,从而能大大缩短usb外设产品的开发周期。 2硬件电路设计 2.1ft232bl芯片简介

vb6.0串口通讯上位机开发视频教程下载地址

资料1 第一章VisualBasic6基本介绍 1. 菜单栏的使用 2. 属性窗口的使用 3. 创建工程 4.窗体的操作 5. 属性值的设定 6. 程序代码编写 7. 制作一个简单应用程序 8. 窗体属性(1) 9. 窗体属性(2) 10. 窗体事件 11. 方法 第二章VisualBasic6的数据类型与运算符表达式 12.数据类型(1) 13. 数据类型(2) 14. 运算符表达式(1) 15.运算符表达式(2) 16. 运算符表达式(3) 第三章VisualBasic6的内部函数 17.常用内部函数(1) 18.常用内部函数(2) 19. 常用内部函数(3) 20. 常用内部函数(4) 21. 常用内部函数(5) 22. 常用内部函数(6) 23. 常用内部函数(7) 24. 常用内部函数(8) 25. 常用内部函数(9) 26. 常用内部函数(10) 第四章VisualBasic6的基本语句 27.基本语句(1) 28. 基本语句(2) 29. 基本语句(3) 30. 基本语句(4) 、 31.基本语句(5) 32. 基本语句(6)

33. 基本语句(7) 34. 基本语句(8) 35. 基本语句(9) 36. 基本语句(10) 37. 基本语句(11) 38. 基本语句(12) 第五章VisualBasic6的数组 39.数组(1) 40.数组(2) 41. 数组(3) 42. 数组(4) 43. 数组(5) 44. 数组(6) 45. 数组(7) 46. 数组(8) 第六章VisualBasic6的过程 47.过程(1) 48.过程(2) 49. 过程(3) 50. 过程(4) 51. 过程(5) 52. 过程(6) 53. 过程(7) 54. 过程(8) 55. 过程(9) 56. 过程(10) 第七章VisualBasic6的标准控件 57. 1111标准控件(1) 58.标准控件(2) 59. 标准控件(3) 60. 标准控件(4) 61. 标准控件(5) 62. 标准控件(6) 63. 标准控件(7) 64. 标准控件(8) 65. 标准控件(9) 66. 标准控件(10) 67. 标准控件(11)

VB串口通信程序代码

vb中怎样用mscomm控件实现串口通信 本问分两部分均来自https://www.doczj.com/doc/a318176814.html, 第一部分jessezappy(晶晶) ================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = False https://www.doczj.com/doc/a318176814.html,mPort = 1 '假定是用COM1口 ' 设定传输速率等,可依照您的需求更改 MSComm1.Settings = "9600,N,8,1" MSComm1.PortOpen = True '---------初始化Modem------------- MSComm1.Output = "ATZ" MSComm1.Output = "AT&F" MSComm1.Output = "ATE0" MSComm1.Output = "ATM1" MSComm1.Output = "ATQ0" MSComm1.Output = "ATV0" '--------------------------拨号------------- MSComm1.Output ="ATDT163" '拨163 '---------------------------接通后 MSComm1.Output ="SDFJDKSJLKFA" '发送字符串 '--------------------- Private Sub MSComm1_OnComm() '用串口事件捕捉数据.. If MSComm1.InBufferCount Then ' 通讯埠中假如有资料的话, 则读取进来 InStringB = InStringB & MSComm1.Input ' 如果资料中有Chr(13) 和Chr(10) 的话, 则显示出来 If InStr(InStringB, vbCrLf) Then instring = instring & InStringB AddText Text3, InStringB, False InStringB = "" End If End If END SUB

VBNET开发全功能串口调试助手

https://www.doczj.com/doc/a318176814.html, 开发全功能串口调试助手(含完整工程) 小记:https://www.doczj.com/doc/a318176814.html, 的串口通信用了很长时间了,也只用 Write 和Read 这样的方 法,以前都是用这种方式做上位机软件, 如此足矣。而前几天研究GSM 模块时对 串口返回的数据总是把握不好,参考开发板附送的例程,发现采用 SerialPort 的DataReceived 事件,可以实现中断触发式的数据接收。于是想到要自己做一 个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。 经过 断断续续的编写,就做成了下面这个小软件: 这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能 不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量 数据接收。 https://www.doczj.com/doc/a318176814.html, 的串口通信主要使用 VS 自带的SerialPort 控件,而不是早先的 MSComm 更具有兼容性,这也是很久以前就放弃 VB 改用.NET 的直接原因。该控 件的主要方法、属性如下(该数据来自 VS 的MSD 帮助库):

想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。打开串口可通过手动指定,也可以使用GetPortNames 方法获取计算机中存在的串口。如果打开出错,则可能是串口不存在或者已被占用。下面是相应代码: Private SubSerialPortOpen() On Error GoToErr If SerialPort.IsOpen = True ThenSerialPort.Close() '避免重复打开端 口 SerialPort.Ope n() LabelCOMStatus.Text ="串口已打开" Exit Sub Err: MsgBox(‘ 串口不存在或已被占用!" + vbNewLine + ErrorToString()) ' 出现错误,显示错误信息 En dSub 如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码: SerialPort.E ncodi ng = System.Text.E ncodi ng.Default 发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制, 需要加入转换代码: Private SubButtonSendData_Click( ByVal sender AsSystem.Object, ByVal e AsSystem.EventArgs) Handles ButtonSendData.Click On Error GoToErr

基于VB 6.0的串口通讯程序设计

基于VB6.0的串口通讯程序设计 摘要:详细介绍了VB6.o中通讯控件MSComm的一些重要属性及在Windows环境下用通讯控件来实现串行通信的编程方法,并结合实例给出了一个基本的通讯程序。 关键词:串行通信;通信控件;Visual Basic6.0 1引言 随着计算机的迅速普及和计算机控制技术的发展,计算机被广泛应用于自动化控制领域之中。而要完成一个控制过程一般都要利用集散式计算机控制系统。在这种控制系统中,下位机主要完成对现场数据采集和对设备一级的监控,上位机则要完成对整个系统的采集、分析、处理和控制以及数据、图形显示、打印、人机对话等工作。而上位机与下位机大多是通过PC机的RS-232串行接口实现通信。随着Windows系统的普及,越来越多的用户由DOS系统转向了Windows系统,这使得数据采集及工业控制软件也上升到了Windows环境下。这就给程序员提出了如何编写面向Windows的串行通信程序问题。 虽然Windows提供了完备的开放式通用增强的W32API(应用程序接口)函数,它把对串口和其他通信设备的支持和基本输入驱动程序集于一体。但是,对于非专业软件设计人员来说,使用VC++,C等高级语言来完成这类程序的设计,其复杂性与专业化程度依然很高。 而Visual Basic6.0(以下简称VB)是一个Windows下简单、易学、高效的可视化软件开发平台,它以所见即所得的可视化界面设计风格和32位面向对象程序设计的特点,已被广泛应用到各个领域,成为众多开发人员采用的工具。VB 不但提供了良好的界面设计能力,而且在串口通信方面也有很强的功能。它提供的Microsoft Communication control(以下简称MSComm)这样一个通信控件,该控件“隐藏”了大部分串口通信的低层运行过程和许多繁琐的过程,它使用户能够方便地访问Windows下串口通信驱动程序的大多数特性。所以整个串行通信程序的开发过程变得十分简单易行,程序员不需要处理繁琐的细节,而通过利用通信控件,只需编写少量的代码来实现主要应用功能和界面的设计,就可以完成软件的开发过程。 2VB6.0串行通信控件的介绍 MSComm是Microsoft公司提供的主要用于串行通信编程的ActiveX控件。ActiveX控件包括一系列的属性、方法和事件,应用程序通过ActiveX控件提供的接口来访问控件的功能。我们知道通过C、VC++编写串口通信程序,是要

计算机网络实验——VB实现串口通信

专业: 班级: 学号: 姓名: 2011 年5 月4 日 实验3:计算机网络实验——网络编程1 一、实验目的: (1)熟悉和掌握网络编程的基本方法和步骤; (2)进一步理解client/server交互模式; (3)加深学生对于网络协议概念的理解以及协议的设计和实现方法。 二、实验任务: 使用任意网络编程语言(Java、C、VB、Delphi等)编写网络选课模拟程序,它由client和server 两部分组成,client和server之间的通信基于TCP协议。实现数据的收发。 三、网络编程: 大多数网络应用程序都遵从client/server交互模型。该模型中,服务器应用是一种专门用来提供某一种服务的程序,它被动地等待通信,而客户应用主动地启动通信,请求服务器的服务。服务器程序既可以接收信息也能发送信息,还可以成为客户。 TCP/UDP赋予每个服务一个唯一的协议端口号。服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。服务器端计算机通过此端口号将收到的请求转向正确的服务器程

序。 大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(Socket API),应用程序通过套接字接口调用来实现和传输层交互。用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接字的一个重要特点是它保留了记录边界。 套节字API主要包括表1所示的接口。 使用面向连接的套接字编程,通过图2来表示其时序。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。 表1 套节字API主要接口 接口解释 SOCKET BIND LISTEN ACCEPT CONNET SEND RECV CLOSE 创建一个新的套接字 给服务器绑定一个传输层地址将服务器设为被动模式 接收客户的一个请求 客户向服务器发起连接 向一个连接的套接字发送数据从一个连接的套接字接收数据终止一个连接

VB编写的简单的上位机

一个简单的用VB编写的上位机程序 自己想做一个简单上位机,却发现相关的资料很少,于是在做出来之后把自己的这样一个简单程序上传,给新入门的朋友一个借鉴学习的资料。 窗口布局 用到的MSComm控件的基本属性(必用) CommPort:设置或返回串口通信的串口号(COM口) 设置格式是:https://www.doczj.com/doc/a318176814.html,mPort[=value],其中object为控件名, 如MSComm1;value的合法值是整形的数据,例如1,2…… 比如https://www.doczj.com/doc/a318176814.html,mPort=1(默认值),表示我们将用COM1口进 行通信 COM口可以通过鼠标右击“我的电脑(计算机)”图标,在弹出的快捷菜单中选择“管理”,弹出如下图左边的对话框 左键点击“设备管理器”可以看到上图右边对话框 左键点击设备管理器可以看到如上图右边视图

其中的就是当前连接到计算机的可用串口了Settings:以字符串的形式设置或返回串口通信参数。 设置格式:https://www.doczj.com/doc/a318176814.html,mPort[=value]其中object为控件名,如MSComm1; Value需为一字符串,由四个设置值组成 其格式为:“波特率,奇偶校验,数据位,停止位” Portopen:设置或返回串口状态,若其已经打开,则返回TRUE,否则返回FALSE 设置格式:object.Portopen[=value]其中object为控件名,如 MSComm1;value为一逻辑值,若为TRUE,则打开,否则关闭注意:如果串口不是打开(关闭),而对它进行关闭(打开)将会出错RThreshold:该属性为一阀值。当接收缓冲区中字符数达到该值时,MSComm 控件设置Commevent属性为ComEvReceive,并产生OnComm事件。 用户可在OnComm事件处理程序中进行相应处理。若Rthreshold属 性设置为0,则不产生OnComm事件。例如用户希望接收缓冲区中 达到一个字符就接收一个字符,可将Rthreshold设置为1。这样接收 缓冲区中接收到一个字符,就产生一次OnComm事件。InputMode:设置或返回接收数据的类型。 设置格式:object.InputMode[=value],其中value的值有两个; comInputModeBinary表示以二进制方式接收数据,Input属性返回值为一字符串 comInputModeText表示以字符方式接收数据,Input属性返回值为一字数组 InputLen:设置或返回一次从接收缓冲区中读取字节数。 设置格式:object.InputLen[=value],value为一个整形数据;当其设 置为0时,表示一次读取接收缓冲区中的全部内容。这个属性在定字 节读取中非常有用 Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。 使用格式:str=object.Input,str为一字符串型变量或对象 Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。 使用格式:object.Output=value,value为一字符串型变量或任意类型的 数组 CommEvent:这是一个非常重要的属性。该属性设计时无效,运行时只读。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm 控件为CommEvent属性赋不同的代码,同时产生OnComm事件。 用户程序就可在OnComm事件处理程序中针对不同的代码,进行相 应的处理。 ComEvReceive接受到Rthreshold个字符。该事件将持续产生,直 到用Input属性从接受缓冲区中读取并删除字符。 其它的属性,需要时可以在网上查找相关资料(下面附几个网址)https://www.doczj.com/doc/a318176814.html,/view/84fb2949336c1eb91a375d91.html 这个里面讲的很详细的

VB串口调试助手源代码

VB串口调试助手源代码 Dim OutputAscii As Boolean Dim InputString As String Dim OutputString As String '============================================================================== ======= ' 变量定义 '============================================================================== ======= Option Explicit ’强制显式声明 Dim ComSwitch As Boolean ’串口开关状态判断 Dim FileData As String ’要发送的文件暂存 Dim SendCount As Long ’发送数据字节计数器 Dim ReceiveCount As Long ’接收数据字节计数器 Dim InputSignal As String ’接收缓冲暂存 Dim OutputSignal As String ’发送数据暂存 Dim DisplaySwitch As Boolean ’显示开关 Dim ModeSend As Boolean ’发送方式判断 Dim Savetime As Single ’时间数据暂存延时用 Dim SaveTextPath As String ’保存文本路径 ' 网页超链接申明 Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub CloseCom() '关闭串口 On Error GoTo Err If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭

VB编写上位机实例

VB编写上位机实例 用VB编写上位机实例(转载) 用VB6.0编写第一个串口通信上位机程序 Visual Basic6.0是一个可视化窗口环境的编程软件,目前使用Visual Basic6.0可以快速简单编写单片机中的串口通信上位机程序。 下面我们以一个完整的通信试验为例子完成如何用Visual Basic6.0编写单片机串口通信程序。单片机学习 HPOO 打开安装好后的Visual Basic6.0主程序界面。选择“标准EXE”。如图1显示,建立Visual Basic的编程环境。 图1 在菜单的[工程]选项中选择[部件],如图2。把Visual Basic的串口通信控件Microsoft Comm control 6.0调入工作菜单。

图2 在打开[部件]对话框中,选择Microsoft Comm control 6.0的选项框,点击[确定]。图3 图3 可以在图示3中可以看通信控件Microsoft Comm control 6.0的文件是在 C:\WINNT\system32\MSCOMM32.OCX文件。 如果大家在首次调用通信控件Microsoft Comm control 6.0控件时无法在控件对话框中找到,请直接在系统目录中搜索名为MSCOMM32.OCX文件。然后通过浏览加入VB的工作界面中。添加完控件回到编程界面。如下图4。

图4 通过右边的菜单把一些必要的控件放在窗体中。然后点击窗体中的Timer控件按F4弹出属性窗口进行设置。其具体设置如下:调频FM发射话筒制作套件 Timer定时器控件设置属性,(通过按F4键可弹出此窗口)

vb串口通信编程

vb串口通信编程 一、概述 串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。 实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB 中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。下面,笔者就介绍一下在VB中实现串口通讯的方法。 在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。下面,笔者就简要地介绍一下 MSComm控件的使用方法。 二、MSComm控件的主要属性、事件 1、MSComm的属性 由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。 Commport:设置通讯所占用的串口号。如设成1(默认值),表示对Com1进行操作。 Setting:对串口通讯的相关参数。包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。 Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。 Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。 Ouput:发送数据到输出寄存器。

InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。 InputMode:设置从输入寄存器中读取数据的形式。若值为0,则表示以文本形式读取;值为1,则表示以二进制形式读取。 OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。 RThreshold:设置在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm 事件之前要接受的字符数。 CommEvent属性:返回最近的通讯事件或错误。通过对它具体属性值的查询,我们就可以获得通讯事件和通讯错误的完整信息。当其值是comEvReceive时表示接收到数据。 2、MSComm的事件 除了公共事件之外,MSComm只有一个OnComm事件。当CommEvent属性值变化时将发生OnComm事件,指示发生一个通讯事件或错误。当我们设置Rtheshold属性值为0时,将使得捕获comEvReceive事件无效。 三、串口通讯编程实例 在完成了对MSComm控件的简要介绍之后,笔者就以实际程序为例,介绍一下串口通讯的具体实现方法。 1、PC机间的串口通讯 (1)、实现方法: A、新建一个窗体,在上面放两个Text控件、两个CommandButton控件和两个Label控件(如图1.bmp所示)。 具体见下表:

VB串口通信程序设计典型实例{修}

V B串口通信程序设计典型实例 利用VB开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数实现。不过,只要MSComm控件可以被选用,我们推荐选择此控件实现,因为MSComm控件的功能和API调用一样强,甚至比它还好且使用起来更加简单。 在本章提供的串口通信程序设计中,除了PC与PC串口通信外,PC与单片机、PC与智能仪表、PC与PLC、PC与GSM短信模块等串口通信任务的实现均采用MSComm控件。 6.1 PC与PC串口通信程序设计 当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需3根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。 本设计通过两台PC串口3线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。 6.1.1 PC与PC串口通信程序设计目的 (1)掌握PC与PC串口通信的线路连接方法。 (2)利用MSComm控件和API函数实现PC与PC串口通信的程序设计方法。 6.1.2 PC与PC串口通信程序设计用软、硬件 本设计用到的硬件和软件清单如表6-1所示。 表6-1设计用软、硬件 6.1.3 PC与PC串口通信程序硬件线路图 线路说明,在计算机通电前,按图6-1所示将两台PC通过串口线连接起来:计算机A 串口COM1端口的TXD与计算机B串口COM1端口的RXD相连,计算机A串口COM1端口的RXD与计算机B串口COM1端口的TXD相连,计算机A串口COM1端口的GND与计算机B串口COM1端口的GND相连。

图6-1 PC与PC串口通信线路 6.1.4 设计任务 利用MSComm控件和VB API函数编写程序实现PC与PC串口通信。 任务要求,两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。 实际上就是编写一个简单的双机聊天程序。 6.1.5 任务实现 利用MSComm控件实现字符型数据发送与接收 1.建立新工程 VB使用“工程”来管理每一个应用程序要使用的所有文件,每建立一个新程序,就要新建一个工程。一个工程由窗体、标准模块、控件及应用所需的开发环境设置等组成。 运行VB程序,出现“新建工程”对话框,选择“标准EXE”,单击“打开”命令按钮,进入VB工程集成开发环境,窗体设计器中自动出现一个名为Form1的空白窗体。 2.程序界面设计 向空白窗体添加各种控件,以完成预定的各种功能。开始一个项目的设计时,VB的工具箱中会有许多默认的控件让设计者予以选用,这些原本就出现在工具箱中的控件是内置控件,它提供了一些基本的系统设计组件给设计者,但功能比较特别的控件就不会出现在其中,如用来设计串口通信功能的控件MSComm就不在其中。 (1)添加串口通信控件MSComm。 由于VB的串行通信组件并不会主动出现在工具箱里中,当我们需要MSComm控件时,首先要把它加入到工具箱中。 让MSComm控件出现在工具箱中的步骤如下。 选择“工程”菜单下的“部件…”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“Microsoft Comm Control 6.0”复选框,单击“确定”按钮后,在工具箱中就出现了一个形似“电话”的图标,它就是MSComm控件。 工具箱中有了MSComm控件,就可以选择MSComm控 图6-2 程序窗体界面 件的图标后将其添加到程序窗体上,利用该控件编程,PC就 可以通过VB实现与串口设备的串口通信了。 由于每个使用的MSComm控件对应着一个串行端口,如

利用VB编写串口通信程序

第26卷第2期唐山师范学院学报2004年3月Vol. 26 No.2 Journal of Tangshan Teachers College Mar. 2004 利用VB编写串口通信程序 李小慧 (唐山师范学院计算机系,河北唐山 063000) 摘要:通过实例,介绍利用VB进行串行通信编程的方法,即如何通过Mscomm控件进行串口通信数据的读写。 关键词:串口通信;软件;属性;事件;端口 中图分类号:TN919.3 文献标识码:B 文章编号:1009-9115(2004)02-0084-03 自动化是人类一起努力的目标,期待以其他的方式来代替人类完成一些困难或者是周期性的工作。计算机自从诞生以来,经过不断的发展,功能不断提升,软硬件各方面均有长足的进步。Visual Basic(简称VB)是一种在窗口操作平台上的视觉开发工具,使得开发更方便快捷。 现代的世界是一个高度自动化的世界,各种设备都可以和计算机作连线,而最简单的自动化连线方式就是使用串行通信。VB提供了串行通信控件,让开发者可以方便快捷地开发串行通信程序。利用计算机进行串口通讯是自动化将来发展的一种方向。 1串行通信的实现 1.1实现方式 利用VB进行串口通信的开发,主要是使用一个控件:Mscomm控件。它的目的是为了让用户设计一个系统可以和串行端口进行沟通及传送数据,提供了下列两种方式来处理信息的流动:事件驱动:是处理连接端口通信的一种有效方法。当有事件发生时,程序会被告知。例如,在有一个字符到达或者一个变化发生时,程序都可以利用Mscomm控件来侦测并处理这些通信事件及通信错误。预先将程序写入控件的事件程序区块中,一旦事件发生即可自动执行该段程序。 程序通过检查CommEvent属性的值来循环查询事件和错误。例如,对于某些程序,并没有必要每接收一个字符时都产生事件,有时需要接收多个字符或数据包后再回应。固定地向设备查询状态的方式较好。 这两种方式都可达到数据读写的目的,使用时要看实际系统环境而定。 1.2控件属性 在利用Mscomm控件进行编程以前,首先要了解一下这个控件的主要属性: CommPort:设置或返回通信连接端口代号。程序必须指定所要进行通信的端口号,系统才会使用它与外界进行通信。端口号的范围是1-16,一般的计算机只有一个或两个端口号,因此一般我们使用的端口号的范围就是1-2。 Settings:设置初始化参数。以字符串的形式设置或返回连线速度、校验码、数据位、停止位四个参数。连线速度又叫波特率,即每秒通信的以Bit为单位的数据量,一般使用9 600、4 800等波特率。 PortOpen:设置或返回通信连接端口的状态,即端口的“打开”和“关闭”两种状态。使用串口进行通信前要打开串口,使用完毕后要关闭串口。在VB中用逻辑值True代表打开,False代表关闭。 Input:从输入寄存器返回并删除字符。即从串口读取数据并清除寄存器中已被读取的数据。 Output:将欲传送的数据写入传输寄存器。即向串口写数据。 InputLen:指定由串行端口读入的字符串长度字节个数。 Rthreshold:设置或返回引发接收事件的字长数,即“最小接收字符数”。当接收寄存器达到所设置的 ────────── 收稿日期:2002-12-22 作者简介:李小慧(1977-),女,河北唐山人,唐山师范学院计算机系助教。 - 84 -

相关主题
文本预览
相关文档 最新文档