2509|0

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机通信vb的mscomm控件的使用 [复制链接]

    将pc机某串口短接,实现一个文本框发送28个16进制数,然后在一个接收框中接收显示收到的同样的字符.我用文本发送方式很容易实现,直接把分别把文本框内容赋值到output,input就可以了.但是要是采用2进制发送.只能实现一个16进制数的发送,要是发28个就有问题了.我的想法是 把发送文本框中的真正的数据提出来,组成一个字符串发送.然后接收后2个,2个显示,中间补空格即可.主要代码如下:
Dim SendBuffer As String, RevBuffer As String
Dim RelData(1500) As Integer
Dim buffer(300) As String
Dim Inputdata() As Byte
Dim Send_Start(1) As Byte
Dim Send_Data(1) As Byte
Dim x As String
Dim i, j

'主窗体初始化MSCOMM控件
Private Sub form_load()
MSComm.CommPort = 8    'Mscomm控件的CommPort属性定义使用COM8串口
'定义串口数据格式:9600bit/s,无奇偶校验,8位数据,一个停止位
MSComm.Settings = "9600,N,8,1"
MSComm.InputLen = 0                    ' 读取接收缓冲区的所有字符
MSComm.InputMode = comInputModeBinary
MSComm.InBufferSize = 1024
MSComm.OutBufferSize = 512
MSComm.PortOpen = True
MSComm.SThreshold = 0          '不触发发送事件
MSComm.RThreshold = 1          '当接收到一个字符后,触发ONCOMM事件
MSComm.InBufferCount = 0
MSComm.OutBufferCount = 0
'接收到AA表示开始发送,收到55表示发送完毕
Text_SEND.Text= "&HAA,&H00,&H00,&H00,&Hcc,&He0,&H33,&Hf0,&Hd9,&H80,&Hf9,&H00,&Hf3,&H00,&H66,&H00,&Hcc,&H00,&H9f,&H01,&H9f,&H09,&Hcc,&H07,&He3,&H00,&H00,&H00,&H00,&H55" '真正有用的数据28位
Text_RECV.Text = ""
End Sub

Private Sub Button_RECV_C_Click()
Text_RECV.Text = ""
MSComm.InBufferCount = 0
For i = 1 To 300
buffer(i) = 0
Next i
Text_SEND.SetFocus
End Sub
'发送数据
Private Sub Button_SEND_Click()
   ...
'为了防止出错,添加下列语句,要求只传送大小写字母和数字
For i = 1 To Len(Trim(Text_SEND.Text))
        SendBuffer = Asc(Mid(Text_SEND.Text, i, 1))
            If (SendBuffer >= 48 And SendBuffer <= 57) Or(SendBuffer >= 65 And SendBuffer <= 90 And SendBuffer <> 72) Or (SendBuffer >= 97 And SendBuffer <= 122) Then
                RelData(i) = SendBuffer
            End If
    Next i

For i = 1 To Len(Trim(Text_SEND.Text))
Send_Data(1) = CByte(RelData(i))
  MSComm.Output = Send_Data
Next i
End Sub
'接受数据
Private Sub MSComm_OnComm()
Select Case MSComm.CommEvent
         ...
        Case comEvReceive                '接收字符的事件触发
        
         '读缓冲区字符
        For i = 1 To 2000
        Next i
        Inputdata = MSComm.Input
      '在这个文本框存放发送过来的数组数值的字符串
        For i = LBound(Inputdata) To UBound(Inputdata)
        Text1.Text = Text1.Text + Chr(Inputdata(i))
        Next i
        '对上面的字符串每2个截取加空格显示.
        For i = 1 To (Len(Text1.Text) - 1) Step 2
        buffer(i) = Mid(Text1.Text, i, 2)
        Text_RECV.Text = Text_RECV.Text + buffer(i) + Chr(32)
        Next i              
End Select
End Sub
让我困惑的是:
1 我的最终目的是发N*28个数,就是要数组发送。还有其它简化的实现方法么?
2 点击发送按钮,接受的数据在text1中显示字符串AA***55,是正常的。但是发送到最后要要显示的text—receive框时,第一次点击发送出来AA***e3 00 00 00 55 AA***e3 00 00 00 00 55(重复,且少了组00,)单击Button_RECV_C清空接受数据框,第二次点击发送,出现3组正确的数据,这是为啥?而且如果把text—receive用定义的字符串变量代替就得到AA 000 0cc 033...9cc 7e3 000 000,以三个一组,为什么不能代替呢?
(text1是我临时设来观察发送的数据的,目的是显示发送的30个数据字符串)
3 对于mscomm,发送接收2进制时,数据具体是如何传送的?
4 inputlen,Rthreshold,sthreshold,outbuffersize,inbuffersize,inbuffercount,outbuffercount属性的设置,比如数组定义时的大小等与我的发送方式,文本or2进制,还有发送的26进制的n*28的数据有着什么样的内在联系?

  初学单片机,问题比较多,先谢谢了.
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表