我的程序是通过两个串口COM1和COM2,分别连接电脑A与电脑B,功能是为了实现A与B的通讯
现在的问题是:A通过串口调试助手发给我的命令在转发给B的时候,B收不到,必须B在通过我发给A一条命令,此时,A与B才能收到对方发出的命令
同样B给A通过我转发的命令也必须是A发一条命令之后才会收到相互下发的命令。
通过设置断点,程序通过COM1可以读取到A的命令,当A的命令通过COM2写入到B的时候,writefile这个函数无法实现。
两个串口都是同步方式打开并且程序一开始串口成功打开
请帮我分析下会是什么地方出的问题。谢谢
急~
这是写串口的那个类的代码:
BOOL CCESeries::WritePort(const BYTE *buf,DWORD bufLen) 

DWORD dwNumBytesWritten; 
DWORD dwHaveNumWritten =0; //已经写入多少  //ASSERT(hComm != INVALID_HANDLE_VALUE); 
do 
{ //Sleep(500);                   
if (WriteFile (m_hComm, //串口句柄 
buf+dwHaveNumWritten, //被写数据缓冲区 
bufLen - dwHaveNumWritten, //被写数据缓冲区大小 
&dwNumBytesWritten, //函数执行成功后,返回实际向串口写的个数 
NULL)) //此处必须设置NULL 
{ //Sleep(500); 
dwHaveNumWritten = dwHaveNumWritten + dwNumBytesWritten; 
//写入完成 
if (dwHaveNumWritten == bufLen) 

break; 

Sleep(50); 

else 

return FALSE; 

}while (TRUE);  return TRUE; 
}
 

解决方案 »

  1.   

    没有看太明白你的意思,是不是你的程序只是起一个转发的功能?收到从A来的数据,不做处理,直接发给B;同样收到从B来的数据,不做处理,直接发给A,我的理解对不?
      

  2.   

    A到B是透明转发的,但是B到A要判断是什么命令之后在下发。
    我们只提出了一条命令来试验下,大程序上A转到B上其实是通的,因为之前有一条命令会每一秒发一次,打开串口,所以能通
    但是B转到A就死活过不去,只是偶尔在我设置断点的时候才会收到一条或者两条
      

  3.   

    B转到A过不去,其一是计算机接收到了,但是没能发给A,其2就是计算机根本就没收到B发上来的东西。建议你看看接收B数据的那个串口配置是否有问题
      

  4.   

    这是串口那块儿的代码,谢谢了
    if(i_Port<=0||i_Port>10||i_Baud<0||i_Baud>115200||i_Parity<0||i_Parity>3||i_DataBits<5||i_DataBits>8||i_StopBits<0||i_StopBits>3)
    {
    AfxMessageBox("串口1参数不被接受,请重新设置参数!");
    } m_ceSeries.m_OnSeriesRead = OnSeriesRead1;//连接回调 if (!m_ceSeries.OpenPort(this,i_Port,i_Baud,i_Parity,i_DataBits,i_StopBits))
    {

    }
    else
    {
    }
     //////////////////////////////////////////// ////////////////////////////////////////////     
        if(i_Port2<=0||i_Port2>10||i_Baud2<0||i_Baud2>115200||i_Parity2<0||i_Parity2>3||i_DataBits2<5||i_DataBits2>8||i_StopBits2<0||i_StopBits2>3)
    {
    AfxMessageBox("串口2参数不被接受,请重新设置参数!");
    } m_ceSeries2.m_OnSeriesRead = OnSeriesRead2;//连接回调    if (!m_ceSeries2.OpenPort(this,i_Port2,i_Baud2,i_Parity2,i_DataBits2,i_StopBits2))
    { }
    else
    {
    }
        
      //  m_ceSeries.OpenPort(this,1,i_Baud2,i_Parity2,i_DataBits2,i_StopBits2);
       return TRUE;  // return TRUE  unless you set the focus to a control
    }
    下面这是两个下发的方法:
    void CChongDlg::DWMessageCtl_xy(unsigned char *receive,  int length)//通过DSP向总站下发
    {
    unsigned char a[MAXBLOCK/4];
        a[0]='$';
    a[1]=receiveprotocol[0];
    a[2]=receiveprotocol[1];
    a[3]=receiveprotocol[2];
    a[4]=receiveprotocol[3];
        for (int j=0; j<receive_xy; j++)
        {
    a[j+5] = receive[j];
        }
    m_ceSeries2.WritePort(a,receive_xy+5);      //
    receive_xy = 0;
        memset(a,0,MAXBLOCK/4);
    }void CChongDlg::TrProtocol2DSP(unsigned char *receivep,int length)//总站向DSP下发
    {    
    if(flag_receiveprotocol_zz==1)
    {
    m_ceSeries.WritePort(receivep,length);
            flag_receiveprotocol_zz=0;
    memset(receivep,0,MAXBLOCK/4);
            }
    }
      

  5.   

    你调试下,在OnSeriesRead1函数里,就是接收串口数据的函数吧?看能不能执行到这个函数,如果能执行到,也就是计算机能收到数据,那再检查下发的那块代码
      

  6.   

    能给我个邮箱吗?我把程序发给你
    OnSeriesRead1肯定能进去的,后面的那个下发的数组里面都能接收到命令
      

  7.   

    [email protected]
    但是我也不能给你调试的,我没有你的硬件环境