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哪里不兼容,设置有问题,大家给点建议,谢谢。一个问题内的分不能分开发,类似的问题我可以多开几个,给大家发分。

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

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

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