通过serialport.cpp中
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff,(LPARAM)port->m_nPortNr);传递消息然后进入LONG CGraphView::OnComm(WPARAM ch,LPARAM port)函数进行数据处理我的接收数据帧是不定长的,同步传输 有同步头+地址+数据信息+校验+同步尾api中能通过comstat.cbInQue获取缓冲区字节个数,而这个我修改serialport类,传递个数老是内存错误,而不传递长度我提取感觉很费事,想不出怎么弄好,我是新手想各位有经验的给点提示或几句代码,谢谢
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff,(LPARAM)port->m_nPortNr);传递消息然后进入LONG CGraphView::OnComm(WPARAM ch,LPARAM port)函数进行数据处理我的接收数据帧是不定长的,同步传输 有同步头+地址+数据信息+校验+同步尾api中能通过comstat.cbInQue获取缓冲区字节个数,而这个我修改serialport类,传递个数老是内存错误,而不传递长度我提取感觉很费事,想不出怎么弄好,我是新手想各位有经验的给点提示或几句代码,谢谢
cserialport类中(WPARAM ch,LPARAM port):
ch返回一个多态性指针指向保存串口读取数据 port返回串口号我对返回第二个数据进行改装,内存泄漏,如果不改,那一个字符一个字符取,是不是就慢(这里我估计是我处理函数的问题,是不是还是再调用一个专门处理数据的函数?判断同步头,同步尾,校验等)
{
if(m_hComm==INVALID_HANDLE_VALUE)
{
m_hComm=CreateFile( Port, GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING, 0, NULL );
if(m_hComm==INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T("无法打开端口!请检查是否已被占用。"));
return FALSE;
} DCB dcb;
GetCommState(m_hComm,&dcb);
dcb.BaudRate=BaudRate;
dcb.ByteSize=DataBits;
dcb.Parity=Parity;
dcb.StopBits=StopBits;
dcb.fParity=FALSE;
dcb.fBinary=TRUE;
dcb.fDtrControl=0;
dcb.fRtsControl=0;
dcb.fOutX=dcb.fInX=dcb.fTXContinueOnXoff=0; //设置状态参数
SetCommMask(m_hComm,EV_RXCHAR);
SetupComm(m_hComm,16384,16384);
//SetupComm(m_hComm,2048,2048);
if(!SetCommState(m_hComm,&dcb))
{
AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
} //设置超时参数
COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=100;
CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=1000;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=0; if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
{
AfxMessageBox(_T("无法设置超时参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
return TRUE;
} return FALSE;
}
void CSerialPort::ClosePort(void)
{
if(m_hComm != INVALID_HANDLE_VALUE)
{
SetCommMask(m_hComm,0);
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
CloseHandle(m_hComm);
m_hComm=INVALID_HANDLE_VALUE;
//::AfxMessageBox(L"串口已经关闭");
}
}BOOL CSerialPort::ReadData()
{
if(m_hComm==INVALID_HANDLE_VALUE)
{
return FALSE;
} nread = 0 ;
ZeroMemory(rbuffer, BUFSIZE);
BOOL bReadState = (BOOL)ReadFile(this->m_hComm, rbuffer, BUFSIZE, &nread, NULL);
if(!bReadState)
{
//MessageBox(_T("无法从串口读取数据!"));
return FALSE ;
}
else
{
if(nread != 0)
return TRUE ;
}
return FALSE ;
}BOOL CSerialPort::WriteData(const char *data,int length)
{
if(m_hComm==INVALID_HANDLE_VALUE)
{
return FALSE;
} BOOL bWriteState;
DWORD dwBytesWritten=0;
bWriteState=(BOOL)WriteFile(m_hComm,data,length*sizeof(char),&dwBytesWritten,NULL);
return bWriteState;
}
以上是我原来封装使用过的串口类,其中nread就是实际获取到的数据长度啊