CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  控件

加急!求助各位!使用MSCOMM控件和51单片机通讯数据存在冲突。

楼主popularhand(同是天涯沦落人)2005-06-10 09:00:13 在 VB / 控件 提问

我的MSCOMM控件和多个单片机通讯,当我收到一串数据后进行处理然后再发送一串数据,  
  在发送数据时经常性的和别的单片机发的数据冲突(主要是我的数据插入单片机数据中导致两串数据都失败),在我发送数据前我通过检测MSCOMM接收缓冲区是否为空来判断当前是否有单片机数据在发送中,即使这样为什么还是冲突呢?  
   
  很急,求助各位了,在线等!  
   
        For   i   =   0   To   10  
                If   BusIdle   =   True   Then  
                      MSComm.Output   =   bytOrder()’发送数据  
                      Exit   For  
                Else  
                      DoEvents  
                      Sleep   (40)’延时40MS后再检测  
                      DoEvents  
                End   If  
        Next  
   
  Public   Function   BusIdle()   As   Boolean  
        '检查串口数据线是否为空闲    
        Dim   i   As   Integer  
        Dim   MaxNo   As   Integer  
         
        MaxNo   =   2   +   (MachineAddr   *   2)  
   
        For   i   =   0   To   MaxNo  
                If   (frmMain.MSComm.InBufferCount   =   0)   And   (frmMain.MSComm.OutBufferCount   =   0)   Then  
                      If   i   =   MaxNo   Then  
                            BusIdle   =   True  
                      Else  
                            DoEvents  
                            Sleep   (2)   '延时2MS  
                            DoEvents  
                      End   If  
                Else  
                      BusIdle   =   False  
                      Exit   For  
                End   If  
        Next  
         
  End   Function 问题点数:100、回复次数:12Top

1 楼popularhand(同是天涯沦落人)回复于 2005-06-10 09:04:07 得分 0

说明:我是采用三条线(数据发送和接收,地)和单片机通讯的。Top

2 楼domhuang(不名)回复于 2005-06-10 09:18:12 得分 40

在你检测的时候没有发送   。   但是在你发送的过程中   其他的单片机可以发送啊    
  这样不就产生了   冒险竞争了吗    
  你可以多用一根握手线   在发送前检测握手线     为L   可以发送   在发送同时把   握手线置为H  
  同样单片几在发送前也要做这样的检测   这样就能保证每次只能有一个机器在发送Top

3 楼popularhand(同是天涯沦落人)回复于 2005-06-10 09:55:57 得分 0

目前是我使用上面的程序,偶尔使我在发送数据时其实单片机已经正在发送数据了,我打乱别人的数据。我不知道为什么上面的代码不可靠?Top

4 楼DooDu(杜霖:I want,I can(开关拉))回复于 2005-06-10 09:57:20 得分 0

domhuang(不名)说的很正确。  
  另外,sleep的时候用doevents是不管用的。Top

5 楼Wenking003(文君)回复于 2005-06-10 10:07:56 得分 50

你采用的方法有点类似:共享总线的方式,没有一个控制的方式,很容易会出现“抢线”的问题。  
  通常采用的解决方法:由PC机对各点进行轮询,没“问”到的机器就不发言。  
   
  不足之处可能是:影响效率。Top

6 楼popularhand(同是天涯沦落人)回复于 2005-06-10 10:11:33 得分 0

我PC是对各单片机的数据进行处理并回复处理结果,主动方在单片机那。PC是不控制单片机的且单片机数量很多。Top

7 楼domhuang(不名)回复于 2005-06-10 10:17:41 得分 10

单片机是你自己做吗??  
  你的每一个单片机发言(通信)前也要检测握手线的   不然很容易产生冲突  
   
  要不你就用   Wenking003(文君)   说的轮询的方法  
   
   
  Top

8 楼Wenking003(文君)回复于 2005-06-10 10:18:23 得分 0

任何机器在任何时候都可以自由“发言”,当然很容易产生信息的互串互插,这不是你的程序的问题,应该属于系统设计、系统控制的问题。Top

9 楼Wenking003(文君)回复于 2005-06-10 10:21:38 得分 0

而且你采用的是三线的方式,没有握手的控制。  
  不管你怎样判断缓冲区的状态,由于程序的运转是有时间性的,总存在控制的差异性,都无法在你“发言”时不让其它机器发言。Top

10 楼oyzd(阳阳)回复于 2005-06-10 10:49:34 得分 0

建议如下:  
  1.)既然是一台电脑带多个单片机机,就应该给每一个单片机一个ID号(单片机本身应该支持设置自  
          己的ID号),无论是电脑向单片机发送命令(数据)或是单片机向电脑传送数据都应该以唯一的  
          ID号(打头)做标识;  
  2.)上面几位大侠都提过,建议传送数据或命令之前进行一次握手通讯操作。Top

11 楼gg137zeus(分在脚下)回复于 2005-06-10 11:00:08 得分 0

关注Top

12 楼popularhand(同是天涯沦落人)回复于 2005-06-10 11:39:13 得分 0

根据各位所言不建立握手PC与单片机通信是无法保证可靠传输对吗?Top

相关问题

  • 菜鸟问题!!!怎样用mscomm控件与单片机通信?一定给分!!!急急!!!
  • 用MSCOMM控件实现与MCS-51单片机握手,ONCOMM事件怎么不响应的?
  • 高分求救!!!如何控制另一台pc机串口连接的单片机 mscomm控件
  • MSCOMM控件一次OnComm事件只能获取8个,那么单片机里面是不是也是一次只能收8个?
  • pc→单片机的串口通讯,使用spcomm控件,发送时好时坏,怀疑是pc与单片机不同步,应该怎么调?
  • 谁有dxDBGrid控件 for delphi5的?加急.................
  • ********续"用MSCOMM挂断 计算机-MODEM-MODEM-单片机 连接的方法"************
  • 在OCX控件中怎样使用OCX控件?(加急)
  • 单片机
  • 求mscomm控件

关键词

  • 单片机
  • 数据
  • 检测
  • 通讯
  • 控制
  • sleep
  • 电脑
  • pc
  • 握手
  • mscomm

得分解答快速导航

  • 帖主:popularhand
  • domhuang
  • Wenking003
  • domhuang

相关链接

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

广告也精彩

反馈

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