大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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元起,快前往官网查看详情吧