串口通讯的奇偶校验位设置问题

fang_jb 2003-05-21 11:15:49
帖子在这,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 //这个又是什么意思?

谁能帮我解释下这两个取值的意思?
...全文
2360 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
AthlonxpX86 2003-05-21
  • 打赏
  • 举报
回复
看来你对串口和串口编程一点都不了解
思危 2003-05-21
  • 打赏
  • 举报
回复
我用 Delphi+Ms Comm都可以,VC+API当然行了
如果你的实时性要求特别高,那么就需要和搞硬件的交流一下了,是不是可以换其他的方式
fang_jb 2003-05-21
  • 打赏
  • 举报
回复
串口的波特率设置是115200,我算了下,相当于每个字节之间的间隔是0。007ms,也就是说第一个字节和第二个字节之间的奇偶校验位要在0。007ms内完成,win32的api的效率能够吗?
fang_jb 2003-05-21
  • 打赏
  • 举报
回复
那这个方法在设置奇偶校验方式的时候要使用SetCommState函数进行,每次都要设置,如果在一个发送和接收字节时间间隔有限制(1ms)的情况下,能达到要求吗?

还有就象我前面说的,由于有一个奇偶校验切换的时间,会不会发生后一个字节被过滤的情况呢?
思危 2003-05-21
  • 打赏
  • 举报
回复
这个技巧使用了硬件,效率高,而且可以让51编程省不少事。
其他的方法还有但都是软件上的。
fang_jb 2003-05-21
  • 打赏
  • 举报
回复
那一般来说,C51串口通讯在区分地址和数据的时候,有没有其他的方式可以采用?
必须要根据这个奇偶校验位来做判断吗?

PS:那边的帖子我去结掉,这里的,有时间的话麻烦再看看
思危 2003-05-21
  • 打赏
  • 举报
回复
使用这种通讯方式的主要目的是为了使用C51串口通讯方式2或3(异步方式)。从而利用硬件中断来屏蔽掉地址以外的数据。

51在这种状态下时接受的数据为11位:
1位起始、8位数据、1位校验(第9位数据)、1位停止
此时只有在校验位为1时才响应,从而用硬件过滤了地址以外的数据。

下位机启动后,设置串口通讯方式为2或3,监听地址,所以你在发地址时把校验设位MARK,51装置接到地址后,修改校验方式为SPACE开始接收数据,此时你也要把校验设位SPACE发送数据。发送完后还要将通讯方式修改回去。

但就向前面所说,修改校验方式主要是为了利用51的串口通讯方式的硬件屏蔽作用,所以在上传数据没有必要修改校验方式。这要看你们的通讯协议了
fang_jb 2003-05-21
  • 打赏
  • 举报
回复
我刚猜出来大概的意思,不过有个新的问题,想了解下串口具体的工作模式:

现在的数据包是这样表示,第一个字节的数据奇偶校验位为1,后面的奇偶校验位为0,这样就区分了消息包的起始位置,那这里有一个问题,串口在打开的时候可以把parity设置成MARKPARITY,然后去监听串口
那么这时候是不是表示,只有奇偶校验位为1的数据才能进串口?其他数据会在硬件上被忽略?
上面这个问题,做两个假设:
1、是,那么我是否需要在读入这一个字节以后用SetCommState把奇偶校验位重新设置回SPACEPARITY,这样才能进行下一个字节数据的读入?
2、不是,那么所有的数据都可以进入串口的话,本身这个设置就没有意义,难道还有什么API可以得到奇偶校验位的具体数值吗?

如果COM口根据奇偶校验位来进行数据的过滤,那么会不会有这样的情况:
我得到了一个数据头,在我做处理的过程中,由于当前的串口设置为MARK,那可能接下去的数据就被过滤掉了,发生了丢包的情况,即使我的函数是立刻执行了一个SetCommState去设置SPACEPARITY,也有可能发生丢数据的可能,对吗?
思危 2003-05-21
  • 打赏
  • 举报
回复
你的另一个帖子我看了,怎么样?
思危 2003-05-21
  • 打赏
  • 举报
回复
那是指定校验位的值: Space 是 0, Mark 是 1
fang_jb 2003-05-21
  • 打赏
  • 举报
回复
再UP
fang_jb 2003-05-21
  • 打赏
  • 举报
回复
up
SPCOMM的主要属性,方法和事件 1.属性 CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。 BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。 ParityCheck:奇偶校验。 ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。 Parity:奇偶校验 pBits:停止 SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。 2.方法 Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种: ⑴串口已经打开 ; ⑵打开串口错误 ; ⑶文件句柄不是通讯句柄; ⑷不能够安装通讯缓存; ⑸不能产生事件 ; ⑹不能产生读进程; ⑺不能产生写进程; StopComm过程用于关闭串口,没有返回值。 函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。 3.事件 OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。 OnReceiveError : procedure(Sender: TObject; EventMask : DWORD) 当接受数据时出现错误将触发该事件。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧