Win32 串口通信 程序编写--奇校验 偶校验 奇偶检验 设置

最近公司系统需要对接开发第三方的设备,而对方的硬件设备只能通过模拟串口的方式和电脑通讯,所以只能自己开发实现串口通讯。自己实现过程中也是搜网上各路大神的文章和代码。由于网上的讲解文档甚至代码已经有很多了,这里就不一一说了,只说一下这次遇到的问题。

这次厂家的串口使用的是奇校验,由于之前没有接触过串口通讯,在搜了一片文章后,就按照里面的内容去做了,最后也能收到东西,但是随后的解析里面是一塌糊涂。后来才发现是设置串口校验时设置错了。在网上搜了一些文章后,都没有说明是如何设置奇校验的。于是就去查msdn了,网上很多人都是用“BuildCommDCBA”函数通过一个字符串去设置DCB结构体,msdn中也是说明了字符串的格式,,如下:

COMx[:][baud=b][parity=p][data=d][stop=s][to={on|off}][xon={on|off}][odsr={on|off}][octs={on|off}][dtr={on|off|hs}][rts={on|off|hs|tg}][idsr={on|off}]

微软官方的例子:

baud=1200 parity=N data=8 stop=1

上面这个例子的意思是 ,串口的波特率是1200  ,不进行奇偶校验  ,数据位是8 停止位是1.

而后通过BuildCommDCBA 函数获得DCB结构体,再通过SetCommState设置串口配置。无论是网友的文章还是官方都没有说明  BuildCommDCBA  是如何设置奇校验的。

我们查阅msdn 关于DCB的介绍,发现了可以直接通过这是DCB结构体,设置奇校验。下面是MSDN关于DCB结构体的定义:

typedef struct _DCB {
  DWORD DCBlength;
  DWORD BaudRate;
  DWORD fBinary : 1;
  DWORD fParity : 1;
  DWORD fOutxCtsFlow : 1;
  DWORD fOutxDsrFlow : 1;
  DWORD fDtrControl : 2;
  DWORD fDsrSensitivity : 1;
  DWORD fTXContinueOnXoff : 1;
  DWORD fOutX : 1;
  DWORD fInX : 1;
  DWORD fErrorChar : 1;
  DWORD fNull : 1;
  DWORD fRtsControl : 2;
  DWORD fAbortOnError : 1;
  DWORD fDummy2 : 17;
  WORD  wReserved;
  WORD  XonLim;
  WORD  XoffLim;
  BYTE  ByteSize;
  BYTE  Parity;
  BYTE  StopBits;
  char  XonChar;
  char  XoffChar;
  char  ErrorChar;
  char  EofChar;
  char  EvtChar;
  WORD  wReserved1;
} DCB, *LPDCB;

fParity字段就是我们想设置的校验方式字段。而官网中对这个字段有了很详细的说明:

ValueMeaning

EVENPARITY

2

Even parity.

MARKPARITY

3

Mark parity.

NOPARITY

0

No parity.

ODDPARITY

1

Odd parity.

SPACEPARITY

4

Space parity.
  
  

fParity设置为ODDPARITY  就是奇校验了。需要其他校验方式的,可以设置上述其他的类型。

最后列举下这次开发中参考的一些文档。

 

参考文档:

网友文章:

https://www.cnblogs.com/nbsofer/archive/2012/12/21/2827781.html

https://blog.csdn.net/wowocpp/article/details/80564307

MSDN说明:

https://docs.microsoft.com/en-us/previous-versions/ff802693(v=msdn.10)

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/ns-winbase-_dcb

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-buildcommdcba

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-getcommstate

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-setcommstate

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值