帖子在这,200分,搞定了两边一道给分
http://expert.csdn.net/Expert/topic/1812/1812191.xml?temp=.2086756还有个问题:
BuildCommDCB中用的DCB结构
其中有一个Parity字段,取值是:
EVENPARITY Even //偶校验
MARKPARITY Mark //这个是什么意思?
NOPARITY No parity //不校验
ODDPARITY Odd //奇校验
SPACEPARITY Space //这个又是什么意思?谁能帮我解释下这两个取值的意思?

解决方案 »

  1.   

    那是指定校验位的值: Space 是 0, Mark 是 1
      

  2.   

    我刚猜出来大概的意思,不过有个新的问题,想了解下串口具体的工作模式:现在的数据包是这样表示,第一个字节的数据奇偶校验位为1,后面的奇偶校验位为0,这样就区分了消息包的起始位置,那这里有一个问题,串口在打开的时候可以把parity设置成MARKPARITY,然后去监听串口
    那么这时候是不是表示,只有奇偶校验位为1的数据才能进串口?其他数据会在硬件上被忽略?
    上面这个问题,做两个假设:
    1、是,那么我是否需要在读入这一个字节以后用SetCommState把奇偶校验位重新设置回SPACEPARITY,这样才能进行下一个字节数据的读入?
    2、不是,那么所有的数据都可以进入串口的话,本身这个设置就没有意义,难道还有什么API可以得到奇偶校验位的具体数值吗?如果COM口根据奇偶校验位来进行数据的过滤,那么会不会有这样的情况:
    我得到了一个数据头,在我做处理的过程中,由于当前的串口设置为MARK,那可能接下去的数据就被过滤掉了,发生了丢包的情况,即使我的函数是立刻执行了一个SetCommState去设置SPACEPARITY,也有可能发生丢数据的可能,对吗?
      

  3.   

    使用这种通讯方式的主要目的是为了使用C51串口通讯方式2或3(异步方式)。从而利用硬件中断来屏蔽掉地址以外的数据。51在这种状态下时接受的数据为11位:
    1位起始、8位数据、1位校验(第9位数据)、1位停止
    此时只有在校验位为1时才响应,从而用硬件过滤了地址以外的数据。下位机启动后,设置串口通讯方式为2或3,监听地址,所以你在发地址时把校验设位MARK,51装置接到地址后,修改校验方式为SPACE开始接收数据,此时你也要把校验设位SPACE发送数据。发送完后还要将通讯方式修改回去。但就向前面所说,修改校验方式主要是为了利用51的串口通讯方式的硬件屏蔽作用,所以在上传数据没有必要修改校验方式。这要看你们的通讯协议了
      

  4.   

    那一般来说,C51串口通讯在区分地址和数据的时候,有没有其他的方式可以采用?
    必须要根据这个奇偶校验位来做判断吗?PS:那边的帖子我去结掉,这里的,有时间的话麻烦再看看
      

  5.   

    那这个方法在设置奇偶校验方式的时候要使用SetCommState函数进行,每次都要设置,如果在一个发送和接收字节时间间隔有限制(1ms)的情况下,能达到要求吗?还有就象我前面说的,由于有一个奇偶校验切换的时间,会不会发生后一个字节被过滤的情况呢?
      

  6.   

    串口的波特率设置是115200,我算了下,相当于每个字节之间的间隔是0。007ms,也就是说第一个字节和第二个字节之间的奇偶校验位要在0。007ms内完成,win32的api的效率能够吗?
      

  7.   

    我用 Delphi+Ms Comm都可以,VC+API当然行了
    如果你的实时性要求特别高,那么就需要和搞硬件的交流一下了,是不是可以换其他的方式