这是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);
写入的数据包什么都是正常的,下位机也能够进行相应的相应。但是返回的总是乱码。// 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);
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;
}注意结贴。
是否将所有数据都准确发送出去了?
ReadFile(hCom,readbuf,100,&bReadStatus,NULL);
是否将数据都准确接收到了?
如果只是部分数据,肯定乱码了
http://download.cnet.com/ComTrace/3000-2218_4-75156892.html?tag=mncol感觉好别忘了给个review(评论),谢谢!