枫潇潇 发表于 2008-4-8 08:06:56

请高手指点串口通讯中关于奇偶校验位的问题。

请高手指点串口通讯中关于奇偶校验位的问题。
我现在做的是对一个液晶终端的性能测试,该液晶终端在实际的485通讯网络系统中作为主机,依次发出查询指令,对各个模块进行数据的采集和显示,传送的串行数据格式为每帧11位,分别为起始位(0)、8个数据位、地址数据判断位(“1”表示地址,“0”表示数据)、停止位(1)。
    现在我在PC机上用LabVIEW模拟上述液晶终端的“下位机”(即从机,地址为6aH,对液晶终端发出的指令进行分析,然后返回一串数据,供液晶终端显示。液晶发出的访问命令为8字节,1地址、2年、3月、4日。5时、6分、7秒、8校验和。
    现在的问题是:接收到的数据不正确,问题我的分析就是地址判断位(也就是奇偶校验位)的问题,地址判断位有None、Odd、Ecea、Mark、Space五个选项,不知道该选哪一个?我觉的应该选Mark,但从缓冲区读出的数据已经没有奇偶校验位(“1”表示地址,“0”表示数据),怎样才能分辩是地址还是数据呢?
    或者是还有其他的方法能实现上述的功能?请高手指点。

枫潇潇 发表于 2008-4-8 12:08:23

现在的问题是怎样才能得到每个字节的第9位的值,也就是奇偶校验位的值。

gzw371 发表于 2008-4-9 13:27:17

用属性节点获取parity就可以了,ODD是偶校验

tyler 发表于 2008-4-16 12:20:48

只要保证上位机,下位机串口参数(当然包括Parity了)的设置一致,发送的指令正确,应该就没有问题的

5932828 发表于 2008-5-20 10:19:14

我也很想知道

飞雨天 发表于 2008-6-10 16:17:55

恩,就是多机通讯的问题,归结下,就是上位机如何去读取第9位。。。。
当然了,用visa的属性节点parity去读取的话,肯定是不可以的,为什么?就不用解释了吧?
其实上位机去读取第九位,是很困难的,因为visa没有提供这样的接口,visa应该是基于windows串口控件mscomm的,或者说visa和mscomm都是基于一个windows提供的动态链接库的,当初我看visa没办法实现,就去找mscomm,看它行不行(用mscomm另外一个原因是用了visa的labview程序,打包为安装包的时候,太大了,我不知道它是包含整个visa驱动还是只包含一部分,不管如何,都要额外好多空间,有时候是不能忍受的)。在看了一天关于mscomm的东西,好像也没有直接提供一个接口,让我们去读取第九位的。。。。。。。底下的思考细节和斗争就不说了,我说说我的解决办法:
    受串口多机通讯的影响,一般来说,第九位是用来标识地址/数据的,而不是用来校验(现在校验都用额外一个或者多个字节来做,比如CRC),而且,第九位为1,标识该字节为地址字节,第九位为0,则为数据字节。如此的话,上位机可以这样来做(上位机做模拟接收,和楼主的情景是一样的):把接收方式设置为SPACE,这样,当接收到地址字节的时候,MSCOMM就会产生一个commEventRxParity事件(需要把串口接收的事件commEvReceive关闭,把RThreshold设置为0即可),这样一个事件产生,就说明目前缓存中等待被读取的字节为地址字节(注意是等待被读取而不是已经被读取,另外还需要注意,事先需把ParityReplace设置为空,不然一旦发生校验错误,串口硬件会自动用0x3F来代替原先的数据),剩下来需要做的,就是把串口中的内容读取出来。
   那如何利用commEventRxParity事件来读取呢?刚好我项目中也做到这一块,程序现成的,我把这部分打包帖上来,楼主你参考下,有什么更好的idea,可以拿出来和大家分享~~~~
      简单介绍下我的应用:我是上下位机通讯,发送一个包,包由好多个字节组成,包开头的那个字节,附加位为1,其它字节,附加位为零。为了不乱读取,我需要做一个包开始的判断。怎么判断?当然就是发生commEventRxParity事件,就说明一个包到达了~~嗯,废话说完了,下面是程序:

jiess 发表于 2008-12-26 08:39:17

飞天雨,关于接收数据方面,能不能细说一下呀,你的程序看不懂哦.
因为我不懂LabView,但我懂VB.
我正遇到了这个问题.:loveliness:
页: [1]
查看完整版本: 请高手指点串口通讯中关于奇偶校验位的问题。