⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.frm

📁 字符叠加上位机
💻 FRM
📖 第 1 页 / 共 3 页
字号:
                                   
  End If
Else
   Dialog_input.Show vbModal
   If Dialog_input.mReturnValue = 1 Then
      Call send_word(OSD_code(), 1, (Index - 5 * channel) - 1)
      NUM_blockall = 14 '--------------------------------------一共要发送14个数据块
   
      Label_show(Index).Left = (label_pos(Index, 0) - 1) * Picture_back.Width / 27
      Label_show(Index).Top = (label_pos(Index, 1) - 1) * Picture_back.Height / 14
                                        '-----------------------根据Dialog_input的返回值重置label_show(index)的位置
  End If
   
End If

      If Label_show(Index).Left + Label_show(Index).Width >= Picture_back.Width Then
         Label_show(Index).Left = Picture_back.Width - Label_show(Index).Width
         label_pos(Index, 0) = CByte(Label_show(Index).Left * 27 \ Picture_back.Width + 1) '----获取x坐标位置
      End If
     
      If Label_show(Index).Top + Label_show(Index).Height >= Picture_back.Height Then
        Label_show(Index).Top = Picture_back.Height - Label_show(Index).Height
        label_pos(Index, 1) = CByte(Label_show(Index).Top * 14 \ Picture_back.Height + 1)
      End If

End Sub



'===============================================================================================================
'====================以下四个函数用于控件拖动===================================================================

Private Sub Label_show_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 1 Then
xp = X
yp = Y
label_index = Index '-----------------------------------------------激活当前label_show(index)
Label_show(Index).BorderStyle = 1 '---------------------------------选中Label_show(index)
End If
End Sub


Private Sub Label_show_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

If xp <> 0 And yp <> 0 Then

   Label_show(Index).Left = Label_show(Index).Left + (X - xp)
   
   '------------------判断确保Label_show(index)在Picture_back的边框内
   If Label_show(Index).Left <= 0 Then
       Label_show(Index).Left = 0
   ElseIf Label_show(Index).Left + Label_show(Index).Width >= Picture_back.Width Then
        Label_show(Index).Left = Picture_back.Width - Label_show(Index).Width
   End If

    Label_show(Index).Top = Label_show(Index).Top + (Y - yp)
   If Label_show(Index).Top <= 0 Then
       Label_show(Index).Top = 0
   ElseIf Label_show(Index).Top + Label_show(Index).Height >= Picture_back.Height Then
       Label_show(Index).Top = Picture_back.Height - Label_show(Index).Height
   End If
  
  label_pos(Index, 0) = CByte(Label_show(Index).Left * 27 \ Picture_back.Width + 1) '----获取坐标位置
  label_pos(Index, 1) = CByte(Label_show(Index).Top * 14 \ Picture_back.Height + 1)
     
End If

StatusBar.Panels(1) = "双击打开字符输入对话框。"
StatusBar.Panels(3) = "水平位置:" + Str(label_pos(Index, 0)) '--------------------状态栏随时跟踪显示
StatusBar.Panels(4) = "垂直位置:" + Str(label_pos(Index, 1))
 
End Sub

Private Sub Label_show_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim offset As Byte
offset = 100

If Button = 1 Then
xp = yp = 0
Label_show(Index).BorderStyle = 0
Timer_clickdelay.Enabled = True

End If

End Sub

Private Sub Timer_clickdelay_Timer()

Timer_clickdelay = False

If label_index >= 0 And label_index <= 9 Then
   Call send_position(label_index)

   Label_show(label_index).Left = (label_pos(label_index, 0) - 1) * Picture_back.Width / 27
   Label_show(label_index).Top = (label_pos(label_index, 1) - 1) * Picture_back.Height / 14
End If

End Sub

'====================以上四个函数用于控件拖动===================================================================
'===============================================================================================================



'-----------------发送label_show(index)的位置坐标
Function send_position(ByVal label_index As Integer) '----------发送label_show(index)的坐标
Dim position_code(6) As Byte

If label_index = 0 Or label_index = 5 Then
   Call send_date(label_index)
ElseIf label_index = 1 Or label_index = 6 Then
   Call send_time(label_index)
Else '----------------------------------------------------------连续发送三组汉字坐标
position_code(0) = POSCOM '-------------------------------------写命令
position_code(1) = label_pos(2 + 5 * channel, 0) '--------------label(index)的水平坐标
position_code(2) = label_pos(2 + 5 * channel, 1) '--------------label(index)的垂直坐标
position_code(3) = label_pos(3 + 5 * channel, 0) '--------------label(index)的水平坐标
position_code(4) = label_pos(3 + 5 * channel, 1) '--------------label(index)的垂直坐标
position_code(5) = label_pos(4 + 5 * channel, 0) '--------------label(index)的水平坐标
position_code(6) = label_pos(4 + 5 * channel, 1) '--------------label(index)的垂直坐标

Call send_state(position_code(), 7) '---------------------------发送数据
End If

End Function


Function send_date(ByVal label_index)
Dim date_code(5) As Byte

date_code(0) = DATECOM
date_code(1) = CByte(Day(Date))
date_code(2) = CByte(Month(Date))

If Year(Date) < 2100 And Year(Date) >= 2000 Then
date_code(3) = CByte(CInt(Year(Date)) - 2000)
End If

date_code(4) = label_pos(label_index, 0)
date_code(5) = label_pos(label_index, 1)

Call send_state(date_code(), 6)

End Function
Function send_time(ByVal label_index)
Dim time_code(5) As Byte

time_code(0) = TIMECOM
time_code(1) = CByte(Second(Time))
time_code(2) = CByte(Minute(Time))
time_code(3) = CByte(Hour(Time))
time_code(4) = label_pos(label_index, 0)
time_code(5) = label_pos(label_index, 1)

Call send_state(time_code(), 6)

End Function
'----------------------------控件Label_show(index)的主要事件、函数操作完毕
'===================================================================================================================
'===================================================================================================================











Function initall()

'------------初始化控件mscomm-----------------------------------------------------------------------------------
MSComm1.InBufferSize = 40        '-----------设置MSComm1接收缓冲区为40字节
MSComm1.InBufferCount = 0        '-----------设置输入寄存器所存储的字符数,0清除接收缓冲区
MSComm1.InputMode = comInputModeBinary '-----二进制方式
MSComm1.CommPort = 1             '-----------使用串口com1
MSComm1.Settings = "19200,N,8,1"  '-----------设置通讯参数
MSComm1.RThreshold = 1           '-----------设置一次接收的数据量,每接收完一次这多数据,触发一次oncomm事件
MSComm1.InputLen = 0             '-----------每次读入缓冲区所有字符

If MSComm1.PortOpen = False Then
   MSComm1.PortOpen = True       '------------打开串口
'ElseIf vbYes = MsgBox("串口1正在使用,继续操作吗?", vbYesNo + vbQuestion + vbDefaultButton2, "串口冲突") Then
'       Picture_back.Enabled = False
'       Else
'       Unload Me
End If
'------------控件mscomm初始化完毕---------------------------------------------------------------------------------

'------------控件timer初始化-------------------------------------------------------------------------------------
Timer_over.Enabled = False
Timer_senddelay.Enabled = False
Timer_clickdelay.Enabled = False
Timer_settime.Enabled = True
'------------控件timer初始化-------------------------------------------------------------------------------------

'------------控件Label_show初始化----------------------------------------------------------------------------------
For i = 0 To 9
Label_show(i).AutoSize = True
Label_show(i).FontName = "宋体" '-----------------字体设置
Label_show(i).FontSize = Picture_back.Width / 390  '-------随屏幕改变设定字符大小
Next
Label_show(1).Caption = Str(Hour(Time)) + ":" + Str(Minute(Time)) + ":" + Str(Second(Time)) '----显示时间
Label_show(0).Caption = Str(Year(Date)) + "/" + Str(Month(Date)) + "/" + Str(Day(Date)) '--------显示日期
'-----------控件Label_show初始化完毕------------------------------------------------------------------------------

'------------控件command_channel初始化----------------------------------------------------------------------------
channel = 0 '------------------------初始值为视屏1

For i = 5 To 9
Label_show(i).Visible = False '-------视屏2不可见
Next
'------------控件command_channel初始化完毕------------------------------------------------------------------------

'------------初始化状态栏statusbar--------------------------------------------------------------------------------
StatusBar.Panels(2) = "视屏1"
StatusBar.Panels(3) = "水平位置:" + Str(label_pos(label_index, 0))
StatusBar.Panels(4) = "垂直位置:" + Str(label_pos(label_index, 1))
'------------初始化状态栏statusbar完毕----------------------------------------------------------------------------

'------------坐标位置数组初始化-----------------------------------------------------------------------------------
For i = 0 To 9
label_pos(i, 0) = CByte(val(Label_show(i).Left * 27 \ (Picture_back.Width) + 1))
label_pos(i, 1) = CByte(val(Label_show(i).Top * 14 \ (Picture_back.Height) + 1))
Label_show(i).Left = (label_pos(i, 0) - 1) * Picture_back.Width / 27 '-----Labek_show(index)重新定位
Label_show(i).Top = (label_pos(i, 1) - 1) * Picture_back.Height / 14
Next
'------------坐标位置数组初始化完毕-------------------------------------------------------------------------------

End Function














'===============================================================================================================
'======================以下为发送字符的串口操作函数=============================================================

Function send_bytes(outdata() As Byte)
'--------向串口发送一个块的数据--------------------------------------------
'--------outdata(num as byte) ,当前要发送的数据块,可以是任意字节长度
If MSComm1.PortOpen = True Then
MSComm1.OutBufferCount = 0 '-----------------清空输出寄存器
MSComm1.Output = outdata   '-----------------发送数据

Timer_over.Enabled = True
End If
End Function

Function send_word(send_code() As Byte, ByVal num_block, ByVal num_string)
'-----------------发送字符串点阵函数
'-----------------send_code()所有要发送的数据
'-----------------NUM_bloke,标记当前是第NUM_bloke个数据帧
'-----------------num_string,对应屏幕的第几个字符串,取值范围0-5


Call send_bytes(RLI) '---------------------------------请求建立通讯链接
Timer_over.Enabled = True

ReDim send_buffer(56)

send_buffer(0) = WORDCOM
send_buffer(1) = num_string
send_buffer(2) = num_block - 1

For i = 0 To 53 '---------------------------------------将要发送的数据放入缓冲区send_buffer(53)内,
send_buffer(i + 3) = send_code(num_block - 1, i) '------提取发送代码的第num_block个数据块,并存储到发送缓冲区send_buffer.                                       '------------等待接收到ACK肯定应答后发送该数据块
Next

End Function

Function send_state(send_code() As Byte, ByVal buffer_len)

'----------------发送以帧数据,数据量小于54bytes------------------------------------------------
Dim sum As Integer
sum = 0 '-----------------------赋初值

Call send_bytes(RLI) '---------------------------------请求建立通讯链接
Timer_over.Enabled = True

ReDim send_buffer(buffer_len + 2)

For i = 0 To buffer_len - 1
send_buffer(i) = send_code(i)
sum = sum + send_code(i)
Next
send_buffer(buffer_len) = sum Mod 256
send_buffer(buffer_len + 1) = ELI
NUM_blockall = 0
End Function

Function NAK_pro()
If Link_success = True Then
   send_times = send_times + 1
   If send_times >= 4 Then
   MsgBox "发送数据超时!", vbOKOnly + vbQuestion + vbDefaultButton1, "提示"
   Link_success = False
   Timer_over.Enabled = False
   Else
   Call send_bytes(send_buffer)
   Timer_over.Enabled = True
   End If
Else
  Link_times = Link_times + 1
  If Link_times >= 4 Then
    MsgBox "链接超时", vbOKOnly + vbInformation + vbDefaultButton1, "提示"
    Link_success = False
    Timer_over.Enabled = False
  Else
    Call send_bytes(RLI)
    Timer_over.Enabled = True
  End If
End If
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -