我使用了网络上的Wushaojian先生的CnComm1.3基类,发现单独发送或者单独接受都没有问题,但是一个函数里面既向串口发信息,同时又接受串口传过来的信息,就不能够接受任何信息,请抽空帮我看看出错的原因,谢谢!
我的采取了两种方式调用都不行,不知道什么原因:
第一种方案:
m_Com1.Open(1, "9600, 8, n, 1");
OnPaySendData();//1.拼m_SendStr字符串 m_Com1.Write(m_SendStr); //2.对方机器成功接受了m_SendStr字符串
//3.断点,对方机器向我的机器发信息
cnComm::InnerLock lock(&m_Com1);//线程保护
vector<char>& vec_str = m_Com1.GetInput();//我未得到任何信息,获得缓冲区????
m_RecvStr = "";//清空界面
strncpy(m_RecvStr.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
m_RecvStr.ReleaseBuffer();//拷贝倒CString
vec_str.clear();//清空缓冲区
m_RecvStr += "\n\r";
m_Com1.Close();
采取上面的方法,我未获取任何信息,但是如果我采用
1.开启我的com1
m_Com1.Open(1, "9600, 8, n, 1");//默认9600
2.对方机器向我发信息。
3.我在对话框上单独起一个按钮
CString m_Com1Recv,m_Com2Recv;
cnComm::InnerLock lock(&m_Com1);//线程保护
vector<char>& vec_str = m_Com1.GetInput();//获得缓冲区
m_Com1Recv = "";//清空界面
strncpy(m_Com1Recv.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
m_Com1Recv.ReleaseBuffer();//拷贝倒CString
vec_str.clear();//清空缓冲区
m_Com1Recv += "\n\r";
这里GetInput能够获取信息。
第二种方案:
1.先拼接字符串,向对方发信息
2.对方接受,并我的机器返回信息
3.启动自动接受对方机器发过来信息,并循环接受对方的机器发过来的信息,知道自动接受确认成功。 m_Com1.Open(1, "9600, 8, n, 1");
if (m_ntran_type==1) //1 交易 2退交易 3 签到
{
OnPaySendData();
}
m_Com1.Write(m_SendStr);
//m_Com1.Close();
//OnButton2() ;
//ASSERT(m_Com1.IsOpen());
//等待30秒
cnComm::InnerLock lock(&m_Com1);//线程保护
//并循环接受对方的机器发过来的信息,知道自动接受确认成功。
while (!m_flag)
{
char buf[1024];
memset(buf,0,1024);
vector<char>& vec_str = m_Com1.GetInput();//获得缓冲区
m_RecvStr = "";//清空界面
strncpy(m_RecvStr.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
m_RecvStr.ReleaseBuffer();//拷贝倒CString
vec_str.clear();//清空缓冲区
m_RecvStr += "\n\r";
}//自动接受也失败。
LRESULT CTEST0::OnComRecv(WPARAM wParam, LPARAM lParam)
{
if(wParam == 2)//端口号
{
char buf[1024];
m_RecvStr += m_Com1.ReadString(buf, 1024);
m_RecvStr += "\n\r";
m_flag=true;
}
return 0;
}请抽空帮我看看程序,谢谢
我的采取了两种方式调用都不行,不知道什么原因:
第一种方案:
m_Com1.Open(1, "9600, 8, n, 1");
OnPaySendData();//1.拼m_SendStr字符串 m_Com1.Write(m_SendStr); //2.对方机器成功接受了m_SendStr字符串
//3.断点,对方机器向我的机器发信息
cnComm::InnerLock lock(&m_Com1);//线程保护
vector<char>& vec_str = m_Com1.GetInput();//我未得到任何信息,获得缓冲区????
m_RecvStr = "";//清空界面
strncpy(m_RecvStr.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
m_RecvStr.ReleaseBuffer();//拷贝倒CString
vec_str.clear();//清空缓冲区
m_RecvStr += "\n\r";
m_Com1.Close();
采取上面的方法,我未获取任何信息,但是如果我采用
1.开启我的com1
m_Com1.Open(1, "9600, 8, n, 1");//默认9600
2.对方机器向我发信息。
3.我在对话框上单独起一个按钮
CString m_Com1Recv,m_Com2Recv;
cnComm::InnerLock lock(&m_Com1);//线程保护
vector<char>& vec_str = m_Com1.GetInput();//获得缓冲区
m_Com1Recv = "";//清空界面
strncpy(m_Com1Recv.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
m_Com1Recv.ReleaseBuffer();//拷贝倒CString
vec_str.clear();//清空缓冲区
m_Com1Recv += "\n\r";
这里GetInput能够获取信息。
第二种方案:
1.先拼接字符串,向对方发信息
2.对方接受,并我的机器返回信息
3.启动自动接受对方机器发过来信息,并循环接受对方的机器发过来的信息,知道自动接受确认成功。 m_Com1.Open(1, "9600, 8, n, 1");
if (m_ntran_type==1) //1 交易 2退交易 3 签到
{
OnPaySendData();
}
m_Com1.Write(m_SendStr);
//m_Com1.Close();
//OnButton2() ;
//ASSERT(m_Com1.IsOpen());
//等待30秒
cnComm::InnerLock lock(&m_Com1);//线程保护
//并循环接受对方的机器发过来的信息,知道自动接受确认成功。
while (!m_flag)
{
char buf[1024];
memset(buf,0,1024);
vector<char>& vec_str = m_Com1.GetInput();//获得缓冲区
m_RecvStr = "";//清空界面
strncpy(m_RecvStr.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
m_RecvStr.ReleaseBuffer();//拷贝倒CString
vec_str.clear();//清空缓冲区
m_RecvStr += "\n\r";
}//自动接受也失败。
LRESULT CTEST0::OnComRecv(WPARAM wParam, LPARAM lParam)
{
if(wParam == 2)//端口号
{
char buf[1024];
m_RecvStr += m_Com1.ReadString(buf, 1024);
m_RecvStr += "\n\r";
m_flag=true;
}
return 0;
}请抽空帮我看看程序,谢谢
m_hReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventArray[0] = m_hShutdownEvent;
m_hEventArray[1] = m_hReadEvent;
m_hEventArray[2] = m_hWriteEvent;
... ...另起一个线程用事件触发来做接收,要用个死循环
.. ...
for (;;)
{
bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);
if (!bResult)
{
switch (dwError = GetLastError())
{
case ERROR_IO_PENDING:
{
break;
}
case 87:
{
break;
}
default:
{
port->ProcessErrorMessage("WaitCommEvent()");
break;
}
}
}
else
{
bResult = ClearCommError(port->m_hComm, &dwError, &comstat);
if (comstat.cbInQue == 0)
continue;
}
Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);
switch (Event)
{
case 0://by hShutdownEvent
//结束自己;
AfxEndThread(100);
break;
case 1:// read event
GetCommMask(port->m_hComm, &CommEvent);
if(CommEvent & EV_CTS)//根据CommEvent其他状态做其他判断处理
... ... if(CommEvent & EV_RXCHAR)//读一个char;
ReceiveChar(port, comstat);//读一个char;自己累加
break;
case 2: // write event
WriteChar(port);
break;
}
}//end forever loop
... ...
发送就准备好数据,
SetEvent(m_hWriteEvent);
即可