用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测试

解决方案 »

  1.   

    是MFC的啊,就是两边的数据不一致,上位机的buf里面的数据成重复了,原数据是12345,接收完成1122334455,这样的。找不出哪有问题,纠结!!!!!!!
      

  2.   

    串口电缆 有问题 tx,rx 短路了 ?
      

  3.   

    上面说得都不太靠谱,LZ的这个串口通信控件我用过,似乎是CMscomm1吧???。我是这么用的,仅供参考:
    首先,串口通信的收、发操作不要放在一起,即不要放在一个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]这个数组里面了。
      

  4.   

    THANK YOU,刚毕业,最近写测试代码,各种苦逼,