这是MFC里面的一个按钮事件里面的代码 能够正常的和下位机进行通信,当使用rs232-rs485进行转换时下位机返回的数据用该程序时乱码。
写入的数据包什么都是正常的,下位机也能够进行相应的相应。但是返回的总是乱码。// TODO: Add your control notification handler code here
char buff[200];
CString str;
GetDlgItem(IDC_EDI_BUF) -> GetWindowText(str);
sprintf(buff,"%s",(LPCSTR)str);
//MessageBox(buff); //然后打开串口,开始通信
HANDLE hCom; //createFile函数返回的句柄
//打开的是端口一
hCom = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,
0, NULL,OPEN_EXISTING, 0, NULL);
if(hCom == NULL)
{
MessageBox("打开端口一时出现了错误");
}
//设置读写缓冲区的缓冲大小 //改变端口的设备控制块
/*DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate = CBR_9600;
dcb.ByteSize=8;//数据位8位 dcb.Parity = NOPARITY; //有校验

dcb.StopBits=ONESTOPBIT; //一个停止位
if(false==SetCommState(hCom,&dcb))
{
MessageBox("配置端口时出现了错误");
}*/ DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fOutxDsrFlow = false;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fOutxCtsFlow = false;

//#ifdef LPR_DOHERELARGE
// dcb.fRtsControl = RTS_CONTROL_ENABLE;
//#else
dcb.fRtsControl = RTS_CONTROL_DISABLE;
//#endif

/* dcb.fInX = false;
dcb.fOutX = false;
dcb.XonChar = ASCII_XON;
dcb.XoffChar = ASCII_XOFF;
dcb.XonLim = 100;
dcb.XoffLim = 100;*/ if(false==SetCommState(hCom,&dcb))
{
MessageBox("配置端口时出现了错误");
return;
}

//设置读写操作,将缓冲里面的数据写入到串口里面
BOOL isWrite = false;
DWORD length = 100;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(hCom,&dwErrorFlags,&ComStat);

//MessageBox(buff);
//char buff1[100] = "@011W018C0,0001:\r\n"; /*char temp[100];
sprintf(temp,"%s是发送的的数据的长度是%d",buff,strlen(buff));
MessageBox(temp);*/
isWrite = WriteFile(hCom,buff,length,&length,NULL);

if(isWrite == false)
{
MessageBox("写入数据时出现了错误");
return;
}
//写完数据然后从缓冲里面读取数据
//过一段时间才读取缓冲里面的数据
::Sleep(1000);
//读取缓冲里面的数据
BOOL isRead = false;
char readbuf[100];
DWORD   bReadStatus = 0;

memset(readbuf,0,sizeof(readbuf));
isRead = ::ReadFile(hCom,readbuf,100,&bReadStatus,NULL);
if(false == isRead)
{
MessageBox("读数据时出现了错误");
return;
}
/* char temp1[100];
memset(temp1,0,sizeof(temp1));
sprintf(temp1,"%s接收的数据的长度是%d",readbuf,strlen(readbuf)); MessageBox(temp1);*/
GetDlgItem(IDC_RECV_BUFF) -> SetWindowText(readbuf);
//MessageBox();
CloseHandle(hCom);

解决方案 »

  1.   


    DWORD CCom::Read(LPVOID Buffer, DWORD dwBufferLen, DWORD dwWaitTime)
    {
    if(!IsOpen())
    return 0;
    COMSTAT Stat;
    DWORD dwError;
    // 有错误发生!
    if(::ClearCommError(m_hCom, &dwError, &Stat) && dwError > 0)
    {
    // 清除缓冲区,清除所有抛出的读操作
    ::PurgeComm(m_hCom, PURGE_RXABORT|PURGE_RXCLEAR);
    return 0;
    } if(!Stat.cbInQue)
    {
    return 0;
    }

    DWORD dwReadLen = Stat.cbInQue;
    //if(dwBufferLen > Stat.cbInQue)
    //dwBufferLen = Stat.cbInQue;
    if(!::ReadFile(m_hCom, Buffer, dwBufferLen, &dwReadLen, &m_ReadOl))
    {
    if(::GetLastError() == ERROR_IO_PENDING)
    {
    ::WaitForSingleObject(m_ReadOl.hEvent, dwWaitTime);  
    if(!::GetOverlappedResult(m_hCom, &m_ReadOl, &dwReadLen, FALSE))
    {
    if(::GetLastError() != ERROR_IO_INCOMPLETE)
    {
    dwReadLen  = 0;
    }
    }
    }
    else
    {
    dwReadLen  = 0;
    }
    }
    return dwReadLen;
    }注意结贴。
      

  2.   

    isWrite = WriteFile(hCom,buff,length,&length,NULL);
    是否将所有数据都准确发送出去了?
    ReadFile(hCom,readbuf,100,&bReadStatus,NULL);
    是否将数据都准确接收到了?
    如果只是部分数据,肯定乱码了
      

  3.   

    可以用这个串口监控工具监控下载地址:
    http://download.cnet.com/ComTrace/3000-2218_4-75156892.html?tag=mncol感觉好别忘了给个review(评论),谢谢!