如何通过API函数判断奇偶校验的校验位是否正确?在发送串口数据时通过SetCommState设置了奇偶校验的方式,但是在接收数据时,如果不判断校验位依然会正常接收,比如串口精灵就是这样,但是现在需要对校验位进行判断,最好还能直接获取校验位这位的数据,请问该使用什么函数如何获取?注意是用API不用任何控件,用控件我会。

解决方案 »

  1.   

    呵呵,
    校验是否成功收到,是你接收的数据进行校验,
    看串口数据接上的格式了
    如果我接触的电表行业,
    86 XX XX 86 XX XX XX XX XX XX CC 16
    那个CC就是从第二个86后面的位开始,到CC前面一位,加模取到,如果你接收的数据
    自己检查,就要从XX XX XX XX XX XX 这几相加,看和CC是否相等,如相等,刚数据正确
      

  2.   

    拜托楼上的你没有理解我的意思啊,你说的是字节的校验,我说的是位的校验,就是每个字节发送之后都会在这个字节的8个位上用1去异或得到一个校验值放在第九位,而串口在接收数据的时候pc机的系统会根据你设置的dcb的校验位参数去判断校验位是否正确,判断之后就把校验位过虑掉了只留下8位的一个字节,但是通过WaitCommEvent好像可以返回校验的结果,我就是想知道怎么取得这个结果
    查了些资料好像是用SetCommMask ClearCommError  WaitCommEvent这三个API函数 
    我是这么写的不过好像不对
    function TComm.GetCheckResult:boolean;
    var
      dwEventMask: DWORD;
      stat:TCOMSTAT;
      errs:DWord;
    begin
      Result:=TRUE;
      dwEventMask:=0;
      SetCommMask(hCommFile,EV_ERR);
      ClearCommError(hCommFile,errs,@stat);
      WaitCommEvent(hCommFile,dwEventMask,nil);
      if ((dwEventMask and EV_ERR)=EV_ERR) then
        Result:=FALSE;  //检验失败?
    end;
    请高手指点
      

  3.   

    EV_ERR
    A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.  //API帮助
    这个参数怎么用?最后一个CE_RXPARITY是不是就是判断校验位的?但是参数应该用EV_ERR还是CE_RXPARITY?
      

  4.   

    彻底对csdn失望了,一个问题放了这么久都没人回答
      

  5.   

    EV_ERR
    A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.  //API帮助
    这个参数怎么用?最后一个CE_RXPARITY是不是就是判断校验位的?但是参数应该用EV_ERR还是CE_RXPARITY?CE_RXPARITY是系统定义的异常拜托楼上的你没有理解我的意思啊,你说的是字节的校验,我说的是位的校验,就是每个字节发送之后都会在这个字节的8个位上用1去异或得到一个校验值放在第九位,而串口在接收数据的时候pc机的系统会根据你设置的dcb的校验位参数去判断校验位是否正确,判断之后就把校验位过虑掉了只留下8位的一个字节,但是通过WaitCommEvent好像可以返回校验的结果,我就是想知道怎么取得这个结果
    查了些资料好像是用SetCommMask ClearCommError  WaitCommEvent这三个API函数 
    我是这么写的不过好像不对
    function TComm.GetCheckResult:boolean;
    var
      dwEventMask: DWORD;
      stat:TCOMSTAT;
      errs:DWord;
    begin
      Result:=TRUE;
      dwEventMask:=0;
      SetCommMask(hCommFile,EV_ERR);
      ClearCommError(hCommFile,errs,@stat);
      WaitCommEvent(hCommFile,dwEventMask,nil);
      if ((dwEventMask and EV_ERR)=EV_ERR) then
        Result:=FALSE;  //检验失败?
    end;
     setcommmask中设定的事件就是你后来调用waitcommevent的所监视的事件:
    EV_BREAK:在输入时Windows检测到中断;
    EV_CTS :CTS信号改变状态;
    EV_DSR :DSR信号改变状态;
    EV_ERR :发生线状态错误;
    EV_RING :检测到振铃指示;
    EV_RLSD :接收线信号探测状态发生改变;
    EV_RXCHAR:接收缓冲区里收到字符;EV_RXFLAG:收到事件字符,并放入接收缓冲区;
    EV_TXEMPTY:输出缓冲区空。
    此时的返回不是校验错误返回
      

  6.   

    具体实现可以在ev_err事件发生时使用clearcommerror函数取出值查看
    var 
    dwerr:longint;
    comst:COMSTATE;
    clearcommerror(hcom,&dwerr,&comst);
    dwerr=CE_RXPARITY是奇偶校验错标志