求大佬指点
vb吧
全部回复
仅看楼主
level 6
Private Sub 发送_Click()
Dim A1%, B1$, i%, p%
A1 = txtsend.Text
txtreceive.Text = Chr(Val("&H" & A1))
MSComm1.Output = Trim(txtreceive.Text) 'mscomm1口1发送txtsend文本框内容
End Sub
Private Sub 接收_Click()
Dim buf$ '定义一个字符串变量 buf $是关键字string的类型符
buf = Trim(MSComm1.Input) '变量buf=mscomm1接收到的内容
If Len(buf) = 0 Then '如果变量buf=空
txtreceive.Text = "empty" 'txtreceive文本框显示"empty"
Else
txtreceive.Text = buf 'txtreceive文本框显示变量buf
End If
End Sub
只能发1位元素,多位元素怎么发送呢?
2022年04月01日 07点04分 1
level 6
[玫瑰][玫瑰][玫瑰]
2022年04月01日 07点04分 2
level 11
chr
就是它惹的祸
2022年04月01日 07点04分 3
终于看到你的回复了[滑稽]不过楼主这个没这么简单,他是把要发送的十进制数字先当成十六进制来看,然后才用Chr把这个“十六进制数”的ASCII码转换成了一个字符来发送的,如果真的输入十六进制数(带字母的)还会出错呢
2022年04月02日 02点04分
@初音✨七奈 大佬,求指导[微微一笑][微微一笑][微微一笑]
2022年04月02日 02点04分
大佬,是不是有其他方法实现[乖][乖]
2022年04月02日 02点04分
@初音✨七奈 呵呵,反正chr就剩下一个字符了。计算机是按照他的代码严格执行的——“只能发1位元素”
2022年04月03日 06点04分
level 15
要发送文本框里的内容,难道不是直接这样写就可以么:
MSComm1.Output = txtsend.Text
为什么要拐那么多弯呢?
(当然你Trim一下去掉两边空格也没啥)
2022年04月02日 04点04分 4
转换一下16进制呀,没有啥好的办法
2022年04月02日 05点04分
大佬求教,不会呀,搞不出来
2022年04月02日 05点04分
直接发默认ASCII,一般设备都识别不了,需要hex
2022年04月02日 05点04分
level 15
现在的问题是,你到底想发送什么样的内容?
1.输入的内容原文发送?
2.输入十六进制数值,发送该数值?
3.输入十进制数值,转换成十六进制再发送?
感觉你已经把第一种情况排除了
如果是第二种,需要把你的代码当中的A1改成字符串类型
如果是第三种,需要把Val("&H" & A1)改成Hex(A1)
似乎你的需求更接近第三种情况
2022年04月02日 05点04分 5
例如我需要发送010600000001480A 以前都是做定义Dim a(7) As Byte 现在想文本框输入就能发走,格式要hex的
2022年04月02日 05点04分
卡在这弄不了,有一丝丝难受。大佬求救
2022年04月02日 05点04分
level 15
行了,你早说你要发送的内容格式不就完事了
可以这样:
Dim a(7) As Byte
For i = 0 To 7
a(i) = Val("&H" & Mid(txtsend.Text, i * 2 + 1, 2))
Next i
2022年04月02日 05点04分 6
大佬牛逼,666
2022年04月02日 06点04分
大佬你好,发送没问题了,接收又有问题了[呵呵]
2022年04月06日 05点04分
level 6
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytesReceived() As Byte
Dim buffer As String
Dim HData As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '接收十六进制数据。并以十六进制显示
MSComm1.InputLen = 0
buffer = MSComm1.Input '接收数据至字符串中
BytesReceived() = buffer '将数据转入Byte数组中
For i = 0 To UBound(BytesReceived) '显示结果以十六进制显示
If Len(Hex(BytesReceived(i))) = 1 Then
HData = HData & "0" & Hex(BytesReceived(i))
Else
HData = HData & Hex(BytesReceived(i))
End If
txtreceive.Text = HData
'最后将结果后入Text1中
MSComm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.InBufferCount = 0 '清除接收缓冲区
MSComm1.PortOpen = False
Next
End Select
End Sub
不知道为啥不触发
2022年04月06日 05点04分 7
串口控件我也没用过,你可以自己在这段代码里加断点调试一下,看是这个事件完全没有触发,还是触发了但没有按照你的预期要求来执行
2022年04月06日 07点04分
@初音✨七奈 大佬你好,找到原因了。按钮触发可以接收ASCII,不能接收16进制的,怎么改进一下呀,用的1楼按钮接收代码
2022年04月06日 08点04分
level 15
把你7楼的部分代码放到“接收”按钮应该是可以的(有适当的修改):
Dim BytesReceived() As Byte
Dim HData As String
Dim i As Integer
BytesReceived = MSComm1.Input '接收数据至Byte数组中
For i = 0 To UBound(BytesReceived) '显示结果以十六进制显示
If Len(Hex(BytesReceived(i))) = 1 Then
HData = HData & "0" & Hex(BytesReceived(i))
Else
HData = HData & Hex(BytesReceived(i))
End If
Next i
txtreceive.Text = HData
2022年04月06日 11点04分 8
大佬你好,有点小问题,例如发送01就会接受0100后面多两个0,这怎么修改呀
2022年04月07日 00点04分
但影响也不是很大,能读到数据就行。
2022年04月07日 01点04分
@山有扶苏🐵 不太清楚这个现象的原因,你可以把这些多出来的0针对性地去掉,比如如果只是末尾多两个0,那么循环次数减1就可以
2022年04月07日 01点04分
@山有扶苏🐵 如果是每个字节后面都多两个0,那么可能是数据转换的问题,我这里的代码把你原来代码中的buffer去掉了,难道它是起到这个作用的?你可以把buffer按原来的代码加回来试试
2022年04月07日 01点04分
level 6
判断没问题了
Private Sub Command19_Click()
Dim a(8) As Byte, i, n As Integer
For i = 1 To Len(txtreceive.Text) Step 2
a(n) = Val("&H" & Mid(txtreceive.Text, i, 2))
n = n + 1
txtreceive.Text = a
Next
If a(0) = &H7E Then
Shape1.Visible = True
Else: Shape1.Visible = False
End If
End Sub
问题是7E 05 A1 30 33 09 EF只是信号反馈抬头。
需要发送查询状态指令01 01 00 50 00 10 3D D7
01 01 02 00 00 B9 FC 正常状态
01 01 02 00 40 B8 0C 进方向误闯
怎么才能实时通讯显示状态呢?
2022年06月20日 07点06分 10
一样的啊,要么像我前面那样7个字节的比较全写,要么也可以只判断a(4)(目测这是第一个会有不同取值的字节)
2022年06月21日 01点06分
@初音✨七奈 哥哥,可以自动接收数据了。分享一下,rthreshold默认为0 所以触发不了OnComm事件。改成需要接收的字符数长度就行了。但又有个问题我接收的长度不一定,有时候7个有时候8个不知道怎么搞。
2022年06月21日 03点06分
@山有扶苏🐵 这我不清楚了
2022年06月21日 06点06分
level 6
接收缓冲区每次接收之前清空了吗?
2022年06月21日 09点06分 11
大佬以前的问题解决了,新问题:010302XXXXB844我只要读取中间X部分, Dim x(1) As Byte x(0) = BytesReceived(3) x(1) = BytesReceived(4) Text1.Text = x 显示乱码,不知道咋回事
2022年06月24日 02点06分
level 15
你是想显示十六进制的值,还是显示以这个值为编码的字符?
估计你应该要的是这个值本身,这个功能你前面的代码是这样处理的:
For i = 0 To UBound(BytesReceived) '显示结果以十六进制显示
If Len(Hex(BytesReceived(i))) = 1 Then
HData = HData & "0" & Hex(BytesReceived(i))
Else
HData = HData & Hex(BytesReceived(i))
End If
Next i
txtreceive.Text = HData
现在你只要其中的一段,那么只要把For i = 0 To UBound(BytesReceived)改成For i = 3 To 4就可以了
2022年06月24日 03点06分 12
如果你确定是要这个值对应的字符,那么估计是编码本身的问题,仍然用你上面的代码,但是需要把Text1.Text=x改成Text1.Text=StrConv(x,vbUnicode)
2022年06月24日 03点06分
@初音✨七奈 改了后不显示,单独显示 BytesReceived(3)或者 BytesReceived(4)都没问题,合在一起不显示了。Text1.Text = BytesReceived(4)
2022年06月24日 05点06分
@山有扶苏🐵 修改了一下可以了,Text1.Text = BytesReceived(3) * 255 + BytesReceived(4)
2022年06月24日 05点06分
@山有扶苏🐵 好吧,没想到你这次是需要显示的是这一个2字节数值的十进制……你解决了就好
2022年06月24日 05点06分
1