VS2010 MFC高分求一个串口通讯问题的解决方案。

我遇到一个问题:
windows 7 32位系统里用VSPD创建了一对互联的标准设置的虚拟串口3和4。
其中一个端口4连着一个被控制软件B。
我自己写的一个小软件A打开另外一个端口3,发送数据给这个端口3,另外一个软件收到数据后会回馈一个特殊字符ACK 06(00000110),我不关心有没有这个ACK信号,它可有可无,我只在意每次软件B都能稳定收到A的数据。

下面是我VC内com3初始化函数内的代码:

用的标准串口控件,mscomm.ocx

>   try
>   {
>       m_Mscomm3.put_CommPort(3);//串口号
>   }
>   catch (CException* e) 
>   {
>       e->Delete();
>       MessageBox("串口号设置有误!","提示");
>       return;
>   }
> 
>   if ( !m_Mscomm3.get_PortOpen())
>   {
>       try
>       {
>           m_Mscomm3.put_PortOpen( TRUE );  //打开串口
>       }
>       catch (CException* e) 
>       {
>           e->Delete();
>           MessageBox("发送串口打开失败!","提示");
>           return;
>       }
> 
>   } 
>   CString strT;
>   strT="9600 ,n, 8, 1";
>   m_Mscomm3.put_Settings(strT);
>   m_Mscomm3.put_InputMode( 1 ); 
>   m_Mscomm3.put_RThreshold( 1 );
>   m_Mscomm3.put_InputLen(0);  
>   m_Mscomm3.get_Input();  

发送到串口3的代码
if (m_Mscomm3.get_PortOpen())
{
m_Mscomm3.put_Output(COleVariant(strText));
}
//发送的数据格式是:02 ** ** ** ** ** **03 0D
//*号代表ASCii的16进制代码每次只发十几个阿拉伯数字(30-39),02是STX,03是ETX,0D是CR(\r).
问题是:有的时候B只能接受到A的第一次发来的数据,有的时候能连续收到几次,只要出现一次收不到的情况,以后每次都收不到,只能重启软件B后才能再次收到(串口调试软件可以连续稳定收到数据)。完全没有规律,不稳定。但是软件B如果直接连接串口1上的其他硬件,可以稳定的接收数据。是不是我的虚拟串口和软件B哪里不兼容,设置有问题,大家给点建议,谢谢。一个问题内的分不能分开发,类似的问题我可以多开几个,给大家发分。

c++
phenix2009
白色一大坨 啥时候结一下
11 个月之前 回复
phenix2009
白色一大坨 有问题提,没问题帖子结一下吧
11 个月之前 回复
phenix2009
白色一大坨 老板,问题咋样了
12 个月之前 回复
phenix2009
白色一大坨 串口这个,我能想到的,就是串口的参数了,波特率,停止位,校验位,数据位这些是要严格对上的,希望题主可以检查一下。
12 个月之前 回复

3个回答

串口这个比较麻烦,因为不同的下位机,不同的设备,不同的协议都不同。没有硬件,没有办法复现你的问题。
首先,要求下位机的开发商必须给出一个可以运行没有问题的demo,任何语言都可以,或者说通讯协议的文档+有效的技术支持。
如果没有上述条件,下面的工作很难开展。
有了demo,就可以用串口调试助手一类的工具,搞清楚它是怎么通讯的,你的程序和它不同之处,向它靠拢。除了协议,串口的配置,比如说停止位、校验位、时序、波特率等的设置也要和demo一样
在实在没有办法搞清楚协议,而不按照协议,在程序端修正获取的数据,,这是万不得已的办法。
我这里有一本我当时编写串口所看的书,和配套的一些源代码 https://download.csdn.net/download/caozhy/9938980

lnhv013710
lnhv013710 没有DEMO,也不知道通讯协议,只是知道软件B接收串口1的标准扫描枪是没有问题的,协议是标准的。
12 个月之前 回复

那么你的问题我总结一下,就是你自己用虚拟串口向软件b发送,有接收不到数据的状况,必须重启才能恢复,而你用其他的硬件串口,软件b直接连接是可以正常接收数据,不会出现那种状况?
如果如我理解,那么我想是不是可以确认一下发给软件b的协议是不是正确,如果你不知道协议,那么可以进行串口监视,在你软件b和其他硬件交互时,你可以把数据包监视并记录下来,这样对比一下你自己虚拟串口的交互数据。
本人之前做过工业自动化的组态软件,经常处理串口问题,题主如果有问题可以继续留言交流。

phenix2009
白色一大坨 回复lnhv013710: 老板,解决了吗,老板
12 个月之前 回复
phenix2009
白色一大坨 回复lnhv013710: 是啊,这就是标准协议了,你模拟这个协议,发送时候,会失败吗
12 个月之前 回复
lnhv013710
lnhv013710 还有一个情况,我哦那过串口调试软件看到枪发过来的数据,就是:02 ** ** ** ** ** **03 0D,软件B的回馈是16进制的06,
12 个月之前 回复
phenix2009
白色一大坨 回复lnhv013710: 你要是有具体需求,可以加我,之前问题里面给你留联系方式了
12 个月之前 回复
phenix2009
白色一大坨 回复lnhv013710: 我在前公司给客户调过3年的设备,所以类似问题见的不少,无非就是串口参数,串口协议,监视正确的,比较有问题的,解决思路就是这些
12 个月之前 回复
phenix2009
白色一大坨 回复lnhv013710: 串口监视工具,电脑就有,还是说你用的不是Windows系统?
12 个月之前 回复
phenix2009
白色一大坨 回复lnhv013710: 还有你虚拟串口时候的的测试数据用什么发的,是串口调试助手?
12 个月之前 回复
phenix2009
白色一大坨 回复lnhv013710: 你监视了交互数据了吗包括你设置的串口参数都是否对的上
12 个月之前 回复
lnhv013710
lnhv013710 您说的协议是除了rs232以外,别的协议吗,还是说不同的流控制,你的主意很好,我要100多元买个串口监控的,哈哈,看看串口枪传的什么数据给软件B
12 个月之前 回复
lnhv013710
lnhv013710 因为硬件就是一个手持的扫描枪和一台装着软件B的电脑,所以协议就是rs232,枪是通用的标准的所以我感觉协议也没啥特别的。
12 个月之前 回复
phenix2009
白色一大坨 有没有可能是你发的模拟数据和实际设备的对不上造成的
12 个月之前 回复
lnhv013710
lnhv013710 是的,没错,出现一次收不到数据的时候,以后都卡住收不到,但只要重启软件B就可以恢复一会
12 个月之前 回复

从你的描述以及结合我之前做过的串口通信遇到的问题来看,应该是发送数据的格式不符合协议

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐