rs232串口数据通讯,用api,不能发送,也不能接受!我已经用漆包线把com1的2,3引脚给连起来了。
打开,关闭口是正确的,发送不成功,接受的总是“烫烫烫烫”这写字符
代码如下:
void CCommDlg::OnOpenPort()
{
char *pszFileName="COM1";
DCB dcb; hComm=CreateFile(pszFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(hComm==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Open Error!");
}
else
{
GetCommState(hComm,&dcb); dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hComm,&dcb))
{
AfxMessageBox("Set Error!");
CloseHandle(hComm);
}
else
{
AfxMessageBox("Open Success!");
//CloseHandle(hComm);
}
}
}void CCommDlg::OnClosePort()
{
CloseHandle(hComm);
}void CCommDlg::OnSendText()
{
DWORD dwWriteLen;
UpdateData(TRUE);
if(WriteFile(hComm,m_szSendText,m_szSendText.GetLength(),&dwWriteLen,NULL)==TRUE)
{
AfxMessageBox("Written ok!");
AfxMessageBox(m_szSendText);
}
}void CCommDlg::OnGetText()
{
COMSTAT cs;
DWORD dwError,nBytesRead;
char szBuf[8];
ClearCommError(hComm,&dwError,&cs); ReadFile(hComm,szBuf,cs.cbInQue,&nBytesRead,NULL); m_szGetText=szBuf;
UpdateData(FALSE);
}
打开,关闭口是正确的,发送不成功,接受的总是“烫烫烫烫”这写字符
代码如下:
void CCommDlg::OnOpenPort()
{
char *pszFileName="COM1";
DCB dcb; hComm=CreateFile(pszFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(hComm==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Open Error!");
}
else
{
GetCommState(hComm,&dcb); dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hComm,&dcb))
{
AfxMessageBox("Set Error!");
CloseHandle(hComm);
}
else
{
AfxMessageBox("Open Success!");
//CloseHandle(hComm);
}
}
}void CCommDlg::OnClosePort()
{
CloseHandle(hComm);
}void CCommDlg::OnSendText()
{
DWORD dwWriteLen;
UpdateData(TRUE);
if(WriteFile(hComm,m_szSendText,m_szSendText.GetLength(),&dwWriteLen,NULL)==TRUE)
{
AfxMessageBox("Written ok!");
AfxMessageBox(m_szSendText);
}
}void CCommDlg::OnGetText()
{
COMSTAT cs;
DWORD dwError,nBytesRead;
char szBuf[8];
ClearCommError(hComm,&dwError,&cs); ReadFile(hComm,szBuf,cs.cbInQue,&nBytesRead,NULL); m_szGetText=szBuf;
UpdateData(FALSE);
}
我已经用漆包线把com1的2,3引脚给连起来了。用于自发自收的测试。
{
AfxMessageBox("Written ok!");
AfxMessageBox(m_szSendText);
}
你用的是异步方式打开串口,异步方式发送不是这么判断的啊。
{
BOOL fWriteStat;
DWORD dwErrorFlags;
DWORD dwError;
COMSTAT ComStat;
char szError[ 10 ] ;
DWORD ret; if (fCOMMOpened==0) return -2 ;//串口未打开
ret=0;
if (olap)
{
fWriteStat = WriteFile(idComDev,buf,buflen,&ret, &WRITE_OS ) ;
if (!fWriteStat)
{
if ((dwError=GetLastError()) == ERROR_IO_PENDING)
{
while (!GetOverlappedResult(idComDev,&WRITE_OS,&ret, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
OutputDebugString("write io pending");
continue;
}
else
{
//an error occurred, try to recover
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(idComDev, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags > 0)
{
wsprintf( szError, "\n\r <CE-%u>",dwErrorFlags ) ;
OutputDebugString(szError);
}
break;
}
}
}
else
{
// some other error occurred
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(idComDev,&dwErrorFlags,&ComStat ) ;
if (dwErrorFlags>0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags) ;
OutputDebugString(szError);
}
return ( FALSE );
}
}
}
else
{
fWriteStat = WriteFile(idComDev, buf,(DWORD)buflen,&ret, NULL);
if (!fWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
dwError = GetLastError();
// an error occurred, try to recover
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(idComDev, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags >0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
}
else
{
// some other error occurred
ClearCommError(idComDev, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags > 0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
return ( FALSE );
}
}
}
return (ret);
}这是我的一个串口写入的函数,你自己看看如何判断串口是否写成功吧,还有就是检查一下你的串口是否正常
我一直都使用这个类.挺好用的。
我也遇到串口问题
串行口啊,串行通信,也能全双工??
你把COM1和COM2环起来测啊...
2-3
3-2
5-5
把COM1和COM2的2,3交叉,5直连
只是在win2k和winxp下没有成功。关注~~~~~~~~~~