请教:如何用VB的winsock发送数据给单片机。
环境:
单片机,485接口接了一个485转网络的模块,模块有IP地址和端口号。
普通计算机
两者使用网线相连。
现在,能够直接使用winsock连接到模块,而且工作正常,但是,发送数据很麻烦
使用如下方式:
winsock1.senddata &H55
winsock1.senddata &HAA
winsock1.senddata &H1
.
.
.
一位一位的送数据,系统能正常工作,可是很麻烦。
请教达人:
如何把“55AA010101010101”这样的字符串,把55,AA,01,01转换为一位一位的发送出去?
问题点数:100、回复次数:13Top
1 楼KissApple(菊花普洱茶)回复于 2006-03-16 22:17:08 得分 10
为什么要一位一位的送?
我是这样写的
Private Sub txtsend_Change()
winsock1.SendData txtsend.Text
End Sub
或者这样,举个例子
BytesToSend(1) = Mid(send, 4, 2)
BytesToSend(2) = Mid(send, 7, 2)
BytesToSend(3) = Mid(send, 10, 2)
BytesToSend(4) =Mid(send, 13, 2)
BytesToSend(5) = Mid(send, 16, 2)
BytesToSend(6) = Mid(send, 19, 2)
BytesToSend(7) = Mid(send, 22, 2)
然后发送这个数组Top
2 楼xhzg(中文)回复于 2006-03-16 22:32:49 得分 0
单片机接收,如果我们直接发送文本过去,那边收到的是乱七八糟的东西,
通讯的协议是&H的 55AA0101 ....
另外,如果是比较低的档次的片子,呵呵,用数组会丢失数据的,因为在55AA处有一个判断
很麻烦,很讨厌...Top
3 楼xhzg(中文)回复于 2006-03-16 22:35:13 得分 0
还有,我直接
winsock1.senddata hex(85)
那边怎么也收不到我要的&H55阿Top
4 楼qjzrd(学问学问,边学边问,:))回复于 2006-03-16 23:56:08 得分 10
用Byte数组发,不可以吗
通讯的协议双方确认没有问题
应该是没有问题的
最好检查一下你的通讯协议是否正确Top
5 楼xhzg(中文)回复于 2006-03-17 11:28:00 得分 0
可是不行啊
这样就可以
winsock1.senddata &H55
winsock1.senddata &HAA
winsock1.senddata &H1
.
.
.
KissApple(夜凉如水) 兄弟的方法,发出去,单片接不到阿Top
6 楼ilove8(千里|你去哪里了,我等了你很久了!)回复于 2006-03-17 11:45:33 得分 10
VB上用MSCOMM控件进行RS-232通讯
3__2
| |
。 。 。 。 。
。 。 。 。
代码如下:
Private Sub cmdExit_Click()
Comm1.PortOpen = False
End
End Sub
Private Sub cmdReceive_Click()
Dim buf$
buf = Trim(Comm1.Input)
If Len(buf) = 0 Then
txtReceive.Text = "Empty"
Else
txtReceive.Text = buf
End If
End Sub
Private Sub cmdSend_Click()
Comm1.Output = Trim(txtSend.Text)
End Sub
Private Sub Comm1_OnComm()
End Sub
Private Sub Form_Load()
Comm1.PortOpen = True
End Sub
Top
7 楼of123()回复于 2006-03-17 11:50:17 得分 20
两种方法:
1 使用 Byte 数组,在另一贴中给了代码。
2 使用一个 Byte 变量,循环将字符串转换赋值给它,并每次一字节发送。
Dim strData As String, bytChr As Byte, i As Integer
strData = "55AA010101010101"
For i = 0 To Len(strData)\2 - 1
bytChr = Val("&H" & Mid(strData, i * 2 + 1, 2))
winsock.senddata bytChr
Next i
Top
8 楼yoyo9250(俏)回复于 2006-03-17 11:53:52 得分 0
同意楼上Top
9 楼neok(未来程序员)回复于 2006-03-17 12:00:16 得分 10
利用winsock1.senddata + 字符串数据。把你的55,hh等转换成字符串型。
dim send as string
send =55AA010101010101
winsock1.senddata "&H" & Mid(send, 1, 2)
winsock1.senddata "&H" & Mid(send, 3, 2)
winsock1.senddata "&H" & Mid(send, 5, 2)Top
10 楼benyfeifei(狒狒)回复于 2006-03-17 12:00:56 得分 20
上位机发送Byte数组是没有问题的,楼主的问题关键要看单片机那边。
485转网口无非是将TCP或UDP转成串口数据,所以数据的接收完全要看单片机串口接收缓存是否够大,第二个就要看单片机串口中断程序的处理方法是否合理。
很久没有玩单片机了,我只能给你这些参考消息。
----------------------------------
还有,我直接
winsock1.senddata hex(85)
那边怎么也收不到我要的&H55阿
------------------------------------
兄弟,Hex函数返回的是一个字符串啊,
Hex(85)=55,'实际上“55”对应的内存数据为2字节数组,即{&H35,&H35}
做和硬件直接相关的程序,必须要对数据在内存中的组成很清楚。Top
11 楼xhzg(中文)回复于 2006-03-17 12:17:03 得分 0
谢谢各位先........
各位大虾的办法,我也是试了试,可是,片子那边就是没有反应.....
可是,我那个一位一位的办法,竟然好用,奇怪死了....
Top
12 楼benyfeifei(狒狒)回复于 2006-03-17 12:45:27 得分 0
建议你和单片机的开发人员一起调试!光找你这边的问题不一定能得到答案Top
13 楼of123()回复于 2006-03-17 12:55:56 得分 20
问题可能出在转换模块上,也就是说它的速度跟不上你连续发送。试试:
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Dim strData As String, bytChr As Byte, i As Integer
strData = "55AA010101010101"
For i = 0 To Len(strData)\2 - 1
bytChr = Val("&H" & Mid(strData, i * 2 + 1, 2))
winsock.senddata bytChr
Sleep 10
Next i
Top




