有没做RS232通信的高手进!!
两台电脑两台显示器,电脑通过RS232连接,RS232 Pin2,Pin3交叉连接,Pin5 为GND,编写程序使一个小球在一台电脑全屏幕运动,碰到边界反弹,碰到主机右边界穿过,在副机左边出现并按照远路径运动,碰到边界反弹,碰到左边界穿过,继续回到主机运动,如此反复:以下为我编写的两个程序,一个放主机,一个在副机,运行后只能来回穿屏幕一次,希望高手看看代码有何错误。。。主机程序代码:
Dim x As Integer
Dim y As Integer
Dim m As Integer
Dim sk As String
Private Sub Command1_Click()
Randomize
Shape1.Left = Int(((Screen.Width - Shape1.Width + 1) - Form1.Left) * Rnd + Form1.Left) '自動生成小球位置
Shape1.Top = Int(((Screen.Height - Shape1.Height + 1) - Form1.Top) * Rnd + Form1.Top) '自動生成小球位置
x = Int((200 - 150 + 1) * Rnd + 150) '隨機生成小球X方向位移
y = Int((200 - 150 + 1) * Rnd + 150) '隨機生成小球Y方向位移
m = Int((4 - 1 + 1) * Rnd + 1) '隨機生成運動方向
Text1.Text = x
Text2.Text = y
MSComm1.Output = CStr(x) & CStr(y) '同時向副機端傳送X Y位移量
Shape1.Visible = True
Timer1.Enabled = True '打開timer1,小球在主機器端運動
End Sub
Private Sub Form_Load()
MSComm1.PortOpen = True
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
Form1.Width = Screen.Width
Form1.Height = Screen.Height
Command1.Left = Screen.Width / 2 - Command1.Width / 2
Command1.Top = Screen.Height / 2 - Command1.Height / 2
Shape1.Visible = False
Timer2.Enabled = False
End Sub
Private Sub Timer1_Timer()
Form1.Refresh
If m = 1 Then
Shape1.Left = Shape1.Left + x
Shape1.Top = Shape1.Top - y
If Shape1.Left > Screen.Width - Shape1.Width And Shape1.Left < Screen.Width - Shape1.Width + x Then '小球左邊到達 屏幕寬度-小球寬度 和屏幕寬度-小球寬度+X之間時
MSComm1.Output = CStr(1) & CStr(Shape1.Top) '傳送小球方向及垂直坐標給副機端
ElseIf Shape1.Left > Screen.Width Then '小球完全過邊界時
Timer2.Enabled = True '打開timer2,準被偵測接受副機器端效果過左邊界的運動方向和坐標
Timer1.Enabled = False '本主機器端小球運動暫停
ElseIf Shape1.Top < Form1.Top Then
m = 4
End If
ElseIf m = 2 Then
Shape1.Left = Shape1.Left - x
Shape1.Top = Shape1.Top - y
If Shape1.Left < Form1.Left Then
m = 1
ElseIf Shape1.Top < Form1.Top Then
m = 3
End If
ElseIf m = 3 Then
Shape1.Left = Shape1.Left - x
Shape1.Top = Shape1.Top + y
If Shape1.Left < Form1.Left Then
m = 4
ElseIf Shape1.Top > Screen.Height - Shape1.Height Then
m = 2
End If
ElseIf m = 4 Then
Shape1.Left = Shape1.Left + x
Shape1.Top = Shape1.Top + y
If Shape1.Left > Screen.Width - Shape1.Width And Shape1.Left < Screen.Width - Shape1.Width + x Then
MSComm1.Output = CStr(4) & CStr(Shape1.Top)
MSComm1.PortOpen = False
ElseIf Shape1.Left > Screen.Width Then
MSComm1.PortOpen = True
Timer2.Enabled = True
Timer1.Enabled = False
ElseIf Shape1.Top > Screen.Height - Shape1.Height Then
m = 1
End If
End If
End Sub
Private Sub Timer2_Timer()
If MSComm1.InBufferCount > 0 Then 'Comm1端口有數據即接受
sk = MSComm1.Input
m = Val(Mid(sk, 1, 1)) '將副機端運動方向讀出并保存留用
Shape1.Top = Val(Right(sk, Len(sk) - 1)) '重新定位小球垂直坐標
Shape1.Left = Screen.Width - Shape1.Width
Shape1.Visible = True
Timer1.Enabled = True '打開timer1小球開始運動
Timer2.Enabled = False
End If
End Sub
副机程序代码:
Dim x As Integer
Dim y As Integer
Dim m As Integer
Dim st As String
Dim sk As String
Private Sub Form_Load()
MSComm1.PortOpen = True
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
Form1.Width = Screen.Width
Form1.Height = Screen.Height
Shape1.Visible = False
Timer1.Enabled = False
Timer2.Enabled = True '打開timer2偵測接受端數據
Timer3.Enabled = False
End Sub
Private Sub Timer2_Timer()
If MSComm1.InBufferCount > 0 Then '有數據即讀入
st = MSComm1.Input
x = Val(Mid(st, 1, 3)) '將主窗口隨機生成之X方向位移讀出并賦值給本窗口,留待後用
y = Val(Mid(st, 4, 3)) '將主窗口隨機生成之Y方向位移讀出并賦值給本窗口,留待後用
Text1.Text = CStr(x)
Text2.Text = CStr(y)
Timer3.Enabled = True
Timer2.Enabled = False 'timer2使用一次后關閉
End If
End Sub
Private Sub Timer1_Timer()
Form1.Refresh
If m = 1 Then '運動方向及方式
Shape1.Left = Shape1.Left + x
Shape1.Top = Shape1.Top - y
If Shape1.Left > Screen.Width - Shape1.Width Then
m = 2
ElseIf Shape1.Top < Form1.Top Then
m = 4
End If
ElseIf m = 2 Then
Shape1.Left = Shape1.Left - x
Shape1.Top = Shape1.Top - y
If Shape1.Left > Form1.Left - x And Shape1.Left < Form1.Left Then '本副機器端小球左邊到達過 左邊
界 和 左邊界-X 之間時
MSComm1.Output = CStr(2) & CStr(Shape1.Top) '向主機端傳送過左邊界時的狀態及垂直
坐標
ElseIf Shape1.Left > Form1.Width Then '本副機器端小球完全通過左邊界時
Timer3.Enabled = True '打開timer3準備接受主機小球穿過主機
右邊界時的方向和坐標
Timer1.Enabled = False
ElseIf Shape1.Top < Form1.Top Then
m = 3
End If
ElseIf m = 3 Then
Shape1.Left = Shape1.Left - x
Shape1.Top = Shape1.Top + y
If Shape1.Left > Form1.Left - x And Shape1.Left < Form1.Left Then '本副機器端小球左邊到達過 左邊
界 和 左邊界-X 之間時
MSComm1.Output = CStr(3) & CStr(Shape1.Top) '向主機端傳送過左邊界時的狀態及垂直
坐標
ElseIf Shape1.Left > Form1.Width Then '本副機器端小球完全通過左邊界時
Timer3.Enabled = True '打開timer3準備接受主機小球穿過主
機右邊界時的方向和坐標
Timer1.Enabled = False
ElseIf Shape1.Top > Screen.Height - Shape1.Height Then
m = 2
End If
ElseIf m = 4 Then
Shape1.Left = Shape1.Left + x
Shape1.Top = Shape1.Top + y
If Shape1.Left > Screen.Width - Shape1.Width Then
m = 3
ElseIf Shape1.Top > Screen.Height - Shape1.Height Then
m = 1
End If
End If
End Sub
Private Sub Timer3_Timer()
If MSComm1.InBufferCount > 0 Then
sk = MSComm1.Input
m = Val(Mid(sk, 1, 1)) '將主機端小球到達右邊界的運動方向賦值給本副機端
Shape1.Top = Val(Right(sk, Len(sk) - 1)) '將主機端小球到達右邊界的垂直坐標賦值給本副機端
Shape1.Left = Form1.Left - Shape1.Width '副機端小球水平位置重新賦值
Text8.Text = Text8.Text & sk
Shape1.Visible = True
Timer1.Enabled = True '打開timer1,使小球按照接受到的方向和最新初始坐標
按照之前接受的X,Y位移運動
Timer3.Enabled = False '暫時關閉timer3
End If
End Sub