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

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;”,再与硬件通信时,则回码恢复正常,该问题算是得到了解决。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值