C#串口通信初始化校验位设置Mark,收码多一位0x3f解决方案

  • Post author:
  • Post category:其他


C#串口通信初始化是很简单的几行代码,但是最近重拾C#编写上位机软件时候卡在这里快一周了。问题现象:配合的硬件软件是不能修改的,通信协议中串口通信的收发数据都需要校验位设置为Mark,使用以往的串口初始化代码,按照协议发送数据后,发现回码第一位多了个数据0x3f,如果回码分多条,则每一条前都会固定多一位0x3f。但是使用ComMonitor.exe、UartAssist.exe等串口软件发送同样数据时,不会出现这个问题。使用AccessPort.exe监控了下本人代码和串口软件的初始化和收发码数据,发现初始化信息中存在如下不同处。

红线处是两个软件初始化中存在的不同点 。神奇的是串口软件通信正常时,使用我的软件通信存在问题后,再使用串口软件通信,同样出现了收码多一位0x3f现象。

本人串口初始化的代码如下:

comm.BaudRate = 19200;

comm.StopBits = StopBits.One;

comm.Parity = Parity.Mark;

comm.DataBits = 8;

comm.ReadBufferSize = 1024;

comm.WriteBufferSize = 1024;

comm.WriteTimeout = 1000;//设置超时时间为1s

comm.ReadTimeout = 1000;

comm.RtsEnable = true;

comm.DtrEnable = true;

在网上查找了资料、请教了同事,初步判断是校验位设为Mark出现的问题,只是校验位设置为其他的,配接的硬件是不会回码的。网上查找资料显示C++可以解决该问题,只是本人无C++基础,项目要求工期急,现学C++对我来说是个不小的工作量,所以只能继续查找资料。最后同事使用C++编写了个简单串口初始化和收发数据小软件,串口初始化部分代码如下:

dcb.fBinary=TRUE;

m_ctrlBaud.GetWindowTextW(m_strBaud);

m_ctrlDatabits.GetWindowTextW(m_strDatabits);

dcb.BaudRate = _tstoi(m_strBaud); // 数据传输速率

dcb.ByteSize = _tstoi(m_strDatabits); // 每字节位数

dcb.fParity = TRUE;

switch(m_ctrlParity.GetCurSel()) // 校验设置

{


case 0:

dcb.Parity=NOPARITY;

break;

case 1:

dcb.Parity=EVENPARITY;

break;

case 2:

dcb.Parity=ODDPARITY;

break;

case 3:

dcb.Parity=MARKPARITY;

break;

case 4:

dcb.Parity=SPACEPARITY;

break;

default:;

}

switch(m_ctrlStopbits.GetCurSel()) // 停止位

{


case 0:

dcb.StopBits=ONESTOPBIT;

break;

case 1:

dcb.StopBits=ONE5STOPBITS;

break;

case 2:

dcb.StopBits=TWOSTOPBITS;

break;

default:;

}

对比本人串口初始化软件发现C++多“dcb.fParity = TRUE;”这一句设置,通过查找资料,最后在C#的串口中发现如下设置:

在本人串口初始化中增加“comm.ParityReplace = 0;”,再与硬件通信时,则回码恢复正常,该问题算是得到了解决。



版权声明:本文为xiaomei2010280原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。