网站建设资讯

NEWS

网站建设资讯

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

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

创新互联主营硚口网站建设的网络公司,主营网站建设方案,app软件定制开发,硚口h5小程序设计搭建,硚口网站营销推广欢迎硚口等地区企业咨询

红线处是两个软件初始化中存在的不同点 。神奇的是串口软件通信正常时,使用我的软件通信存在问题后,再使用串口软件通信,同样出现了收码多一位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;”,再与硬件通信时,则回码恢复正常,该问题算是得到了解决。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享题目:C#串口通信初始化校验位设置Mark,收码多一位0x3f解决方案-创新互联
链接分享:http://njwzjz.com/article/cohjid.html