lnhv013710
2019-06-17 23:17
采纳率: 96.7%
浏览 594

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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • threenewbee 2019-06-18 09:52
    已采纳

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

    评论
    解决 无用
    打赏 举报
查看更多回答(2条)

相关推荐 更多相似问题