用mfc做的上位机的串口测试程序,但是收发数据不一致,如发送12345,接收的确是1122334455,就指点。上位机程序:
while (1)
{
com->put_Output(COleVariant(data));
theDlg->m_prompt.AddString("PC端发送232口数据完成"); //5.result(status + len + data) <- cpm vs out_of_cpm_inner_loop
CByteArray _inbytes;
int _inlen = 0;
memset(buf, 0, 1024);
while(_inlen < data_len)
{
num = 0;
while(!num)
num = com->get_InBufferCount(); COleVariant _indata(com->get_Input());
_indata.GetByteArrayFromVariantArray(_inbytes); if (_inbytes.GetCount())
{
memcpy(buf + _inlen, _inbytes.GetData(), _inbytes.GetCount());
_inlen += _inbytes.GetCount();
}
}
theDlg->m_prompt.AddString(buf);
}下位机:
while(1)
{ nrecv = 0;
while(nrecv < datalen)
{
memset(recvBuf,0,512);
n = 0;
while ( 0 >= n )
{
n = read(testConsoleFd, recvBuf, datalen - nrecv);
logMsg("read = %d,buf = %s\n", n,recvBuf,0,0,0,0);
}
logMsg("one time read %d\n",n);
nrecv += n;
_lenToRecv = n;
int currLen=0;
int lensend=0;
while(currLen<_lenToRecv)
{
lensend = write(testConsoleFd, recvBuf+currLen, _lenToRecv-currLen );
logMsg("to snd = %d, done = %d,sndbuf = %s\n", _lenToRecv-currLen, lensend,recvBuf+currLen,0,0,0);
currLen+=lensend;
/*logMsg("to write %d bytes,write %d bytes\n",lenToSend,currLen,0,0,0,0);*/
}
}
}MFC测试
while (1)
{
com->put_Output(COleVariant(data));
theDlg->m_prompt.AddString("PC端发送232口数据完成"); //5.result(status + len + data) <- cpm vs out_of_cpm_inner_loop
CByteArray _inbytes;
int _inlen = 0;
memset(buf, 0, 1024);
while(_inlen < data_len)
{
num = 0;
while(!num)
num = com->get_InBufferCount(); COleVariant _indata(com->get_Input());
_indata.GetByteArrayFromVariantArray(_inbytes); if (_inbytes.GetCount())
{
memcpy(buf + _inlen, _inbytes.GetData(), _inbytes.GetCount());
_inlen += _inbytes.GetCount();
}
}
theDlg->m_prompt.AddString(buf);
}下位机:
while(1)
{ nrecv = 0;
while(nrecv < datalen)
{
memset(recvBuf,0,512);
n = 0;
while ( 0 >= n )
{
n = read(testConsoleFd, recvBuf, datalen - nrecv);
logMsg("read = %d,buf = %s\n", n,recvBuf,0,0,0,0);
}
logMsg("one time read %d\n",n);
nrecv += n;
_lenToRecv = n;
int currLen=0;
int lensend=0;
while(currLen<_lenToRecv)
{
lensend = write(testConsoleFd, recvBuf+currLen, _lenToRecv-currLen );
logMsg("to snd = %d, done = %d,sndbuf = %s\n", _lenToRecv-currLen, lensend,recvBuf+currLen,0,0,0);
currLen+=lensend;
/*logMsg("to write %d bytes,write %d bytes\n",lenToSend,currLen,0,0,0,0);*/
}
}
}MFC测试
首先,串口通信的收、发操作不要放在一起,即不要放在一个while(1)死循环里面。
发送数据用m_Comm.put_Output(COleVariant(data))是没有问题的。
发送问题:
串口通信控件的接收事件标示符是“2”。我是这样用的:
void COperation::OnCommMscomm1()//串口接收M数据并处理
{
[align=left]int nEvent=m_Comm.get_CommEvent();//得到事件
switch(nEvent)
{
case 2://接收数据事件
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
CString mydata;
CString temp;
k=m_Comm.get_InBufferCount();//接收缓冲区字符数
if(k>0)
{
variant_inp=m_Comm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
}
default:
break;
}[/align]}接收数据都存在BYTE rxdata[1024]这个数组里面了。