我的程序是通过两个串口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;
}
现在的问题是: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;
}
我们只提出了一条命令来试验下,大程序上A转到B上其实是通的,因为之前有一条命令会每一秒发一次,打开串口,所以能通
但是B转到A就死活过不去,只是偶尔在我设置断点的时候才会收到一条或者两条
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);
}
}
OnSeriesRead1肯定能进去的,后面的那个下发的数组里面都能接收到命令
但是我也不能给你调试的,我没有你的硬件环境