没有合适的资源?快使用搜索试试~ 我知道了~
VB 对九帧数据的发送
3星 · 超过75%的资源 需积分: 9 2 下载量 76 浏览量
2014-11-01
17:12:10
上传
评论
收藏 10KB TXT 举报
温馨提示
试读
8页
串型数据RS232接口的基本概念是以高低脉冲来区分0或者1,以一个字节(Byte)为最小单位进行发送,一个Byte为8个二进制位(BIT),另外附加三个位作为起始位、停止位和奇偶校验位。在选择不使用奇偶校验的情况下,串口一次最小传送10个BIT,如果需要奇偶校验,则是11个BIT
资源推荐
资源详情
资源评论
RS232-485串行接口是一种非常成熟的通信接口,曾几何时,我们用的鼠标是串口的,Modem是串口的,还有早期的一些数码相机都是串口的,时过境迁,家用电脑现在已是USB时代,串口这种东西逐渐淡出了我们的视线。 但是,在工业控制上,串行接口依然有着不可替代的优势,首先是电气连接简单,虽说速率不高,但抗干扰能力强,通讯距离很远,甚至可以铺设几百米的电缆,这些都是USB不能取代的。
对串行接口的操作,微软公司很早前就提供了一个通用控件,她就是大名鼎鼎的MSCOMM,这个控件可以嵌入几乎所有宿主语言,包括主流的VC VB DELPHI C++ Build等等。通过这个控件,我们可以极其轻易地对串口进行操作。但是,这个控件依然不是完美的,因为微软在写这个控件的时候,考虑的都是一般性的常规的操作,不过,一旦遇到非常规操作,控件立刻就显示出它的局限性,正如可视化编程下控件滥用的坏习惯一样,没有人再去花心思研究程序的内部原理,鼠标拖一下,键盘敲几个调用,甚至一个程序就出来了,这并不是好事,一旦遇到非常规事务,立刻就会束手无策。
把话题拉回串行接口,串型数据RS232接口的基本概念是以高低脉冲来区分0或者1,以一个字节(Byte)为最小单位进行发送,一个Byte为8个二进制位(BIT),另外附加三个位作为起始位、停止位和奇偶校验位。在选择不使用奇偶校验的情况下,串口一次最小传送10个BIT,如果需要奇偶校验,则是11个BIT,排列如下:
[起始位] [数据位1到8] [奇偶校验位] [停止位]
奇偶校验的原理是,计算数据位内上升沿的个数,也就是BIT=1的次数,然后再根据这个个数据决定奇偶校验位是0还是1,比如说发送1这个数,并且现在我们选用奇校验,则奇偶校验位是0,因为(原始数据=1,奇偶校验位=0,1+0=1),1是奇数。 如果选用偶校验,则奇偶校验位会自动变成1,(原始数据=1,奇偶校验位=1,1+1=2),2是偶数。发送方将数据和奇偶校验位一起发送,接受方开始接收数据,并且核对奇偶校验位,一旦发现奇偶校验位有误,则立刻报错,因为这说明数据传输受到了干扰。
奇偶校验位一般被称为串口的“第九位”,这个位其实除了校验数据外,还有别的另类玩法。在主机上利用串行接口对多设备进行控制的时候,主机发送到每一条命令,必须要编上地址才行,否则就变成广播操作了,就像老大一声吼,底下的小弟们全部振臂狂呼,这在某些时候确实有用,但如果老大只点了一个小弟的名字让他单独回答,就会出问题了,人类于是有了名字,而在工业控制上,模块都需要编上地址,这跟名字其实没什么本质上的区别。串行数据流里面,往往利用第九位来区分是地址包还是数据包,大家约定,凡是第九位为1的BYTE,说明这是地址,凡是第九位为0的BYTE,那是数据。主机控制下的各分机只有在接受到第九位为1的时候,才进行地址识别,如果确实与主机呼叫的地址一致,才开始识别接下来的数据(第九位为0)。可以看出,这样的方式是很聪明的,各分机没有必要频繁地接收主机发送到数据流,只有收到第九位为1并且符合自己地址之后,才进行接收,效率不言而喻。
如果采用第九位作为地址/数据的区分,那么串口将丧失奇偶校验功能,这是没有办法的事,鱼与熊掌不可兼得嘛。所以在Windows串行接口规范里,对这个位有5种设置,分别是:
NOPARITY = 无校验
ODDPARITY = 偶校验
EVENPARITY = 奇校验
MARKPARITY = 第九位强设为1
SPACEPARITY = 第九位强设为0
在发地址包的时候, 可以把Parity设置成MARKPARITY. 则第九位常为1.
在发数据包的时候, 可以把Parity设置成SPACEPARITY.则第九位常为0.
看起来不困难,无非就是改变第九位的状态而已嘛。但是,很快,可怕的事情来了,使用MSCOMM控件的话,如果频繁地改动奇偶校验操作,则通讯将会出现丢包等莫名其妙的问题!但我们为了区分数据和地址,这种频繁改动又是必须的,怎么办?只能扔掉MSCOMM,另寻他途了。
利用API搭建一个串口通讯程序,是一个好办法,API程序直接作用于Windows,效率很高,VC++用的类库MFC无非也就是将成千上万的API函数集中起来并加以聚合,抽象。现在我们直接使用API,当然是可行的,但是,因为Visual Basic本身的缺陷,她没办法像VC那样创建多线程程序(至少实现起来极其困难),在以下的例子里我们只能采用同步的方法来获得串口的数据而不能实现异步接收,等等,到底什么叫同步?异步?简单地说,比如你拖一个1G的文件从C盘到D盘,这需要大量的时间,如果这段时间系统一直等着它完成COPY的操作,其他什么都不管理,那么这就叫同步(回忆一下DOS时代不就是这样的吗)。但是,如果系统只是给它这么一条指令,然后你该什么时候COPY完后通知我一声,让我知道你COPY完了就行了,系统在这段时间内不会死等这个操作完成,而是释放开给别的有需要的程序(在Windows时代,你可以边COPY边听歌),这就叫异步。很显然,异步操作聪明得多,也比较合理,最大的优势是榨干了CPU的效能,但鉴于VB这方面完全不行,所以也只好采用同步的方法了。
以下是源代码:
API声明:
Option Explicit
'奇偶校验常数
Public Const NOPARITY = 0
Public Const ODDPARITY = 1
Public Const EVENPARITY = 2
Public Const MARKPARITY = 3
Public Const SPACEPARITY = 4
'-------------------------------------------------------------------------------
' 文件操作常数
'-------------------------------------------------------------------------------
Public Const ERROR_IO_INCOMPLETE = 996&
Public Const ERROR_IO_PENDING = 997
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const FILE_ATTRIBUTE_NORMAL = &H80
剩余7页未读,继续阅读
资源评论
- 兜兜猪尔2015-05-15赶脚没什么大用处
嗨思_lb
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功