如何通过API函数判断奇偶校验的校验位是否正确?在发送串口数据时通过SetCommState设置了奇偶校验的方式,但是在接收数据时,如果不判断校验位依然会正常接收,比如串口精灵就是这样,但是现在需要对校验位进行判断,最好还能直接获取校验位这位的数据,请问该使用什么函数如何获取?注意是用API不用任何控件,用控件我会。
解决方案 »
- 人民需要荡妇(转)
- fastreport双击frxReport1后,打印预览结果与编译生成的exe文件执行打印预览的结果为什么不同?
- 计算机通过USB和下位机进行通讯如何实现?100分
- Delphi 6和RealOne的ActiveX控件好像有冲突。问的问题太多没分了,不好意思。
- 《中国开发者联盟》 欢迎您的加入!
- 如何访问ini文件?
- select count(*) from 咨询 返回数值问题?
- 有关BDE Administrator 的问题
- 小弟又茫然了!
- delphi idtcpclient怎么做
- 为什么线程FREE了但内存却不能释放了?
- 如何将几个十进制的数字转二进制数,并且将其连接起来啊?
校验是否成功收到,是你接收的数据进行校验,
看串口数据接上的格式了
如果我接触的电表行业,
86 XX XX 86 XX XX XX XX XX XX CC 16
那个CC就是从第二个86后面的位开始,到CC前面一位,加模取到,如果你接收的数据
自己检查,就要从XX XX XX XX XX XX 这几相加,看和CC是否相等,如相等,刚数据正确
查了些资料好像是用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;
请高手指点
A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY. //API帮助
这个参数怎么用?最后一个CE_RXPARITY是不是就是判断校验位的?但是参数应该用EV_ERR还是CE_RXPARITY?
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:输出缓冲区空。
此时的返回不是校验错误返回
var
dwerr:longint;
comst:COMSTATE;
clearcommerror(hcom,&dwerr,&comst);
dwerr=CE_RXPARITY是奇偶校验错标志