CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

请教:如何用VB的winsock发送数据给单片机。

楼主xhzg(中文)2006-03-16 21:19:23 在 VB / 基础类 提问

环境:  
      单片机,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

相关问题

  • 请教:如何用VB的winsock发送数据给单片机。
  • 单片机以十六进制方式接受数据,winsock该如何发送数据?
  • 单片机通信数据不正确
  • 单片机如何保存数据,供PC机查看?
  • 如何向单片机发送大于128的字符数据
  • 如何向单片机发送大于128的字符数据
  • 单片机串口通信,收不到第二个数据
  • 在VB中使用VB与单片机实现MODEM通信的问题?
  • mscom如何通过modem接受从单片机发来的数据?
  • 如何使pc机从串口读取单片机数据并显示之??

关键词

  • 单片机
  • winsock
  • 数据
  • 模块
  • 转换
  • 通讯
  • 协议
  • sleep
  • senddata
  • bytestosend

得分解答快速导航

  • 帖主:xhzg
  • KissApple
  • qjzrd
  • ilove8
  • of123
  • neok
  • benyfeifei
  • of123

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo