下面是MFC实现的部分关键代码(仅供参考)
SendDlg::SendDlg(CWnd* pParent /*=NULL*/)
: CDialog(SendDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(SendDlg)
m_Baud = -1;
//}}AFX_DATA_INIT
CurrentlyDisplayMax = 0;
m_Text0 = "请确认电缆线已与COM1口正确连接,";
m_Text = "复位显示屏后,单击“发送”按钮。";
IsSend = false;
m_bConnected=false;
m_nBaud = 9600;
m_Baud = 1;
m_nDataBits = 8;
m_bEcho = FALSE;
m_nFlowCtrl = 0;
m_bNewLine = FALSE;
m_nParity = 1;
m_sPort = "COM1";
m_nStopBits = 0;
}
SendDlg::~SendDlg()
{
if(m_bConnected)
CloseConnection();
}
BOOL SendDlg::ConfigConnection() //打开串口COM1设定
{
DCB dcb;
if(!GetCommState(m_hCom, &dcb))
return FALSE;
dcb.fBinary=TRUE;
dcb.BaudRate=m_nBaud; // 波特率
dcb.ByteSize=m_nDataBits; // 每字节位数
dcb.fParity=TRUE;
switch(m_nParity) // 校验设置
{
case 0: dcb.Parity=NOPARITY;
break;
case 1: dcb.Parity=EVENPARITY;
break;
// case 2: dcb.Parity=ODDPARITY;
// break;
// default:;
}
switch(m_nStopBits) // 停止位
{
case 0: dcb.StopBits=ONESTOPBIT;
break;
case 1: dcb.StopBits=ONE5STOPBITS;
break;
case 2: dcb.StopBits=TWOSTOPBITS;
break;
// default:;
}
// 硬件流控制设置
dcb.fOutxCtsFlow=m_nFlowCtrl==1;
dcb.fRtsControl=m_nFlowCtrl==1?
RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
// XON/XOFF流控制设置
dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
dcb.XonChar=XON;
dcb.XoffChar=XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
return SetCommState(m_hCom, &dcb);
}
BOOL SendDlg::OpenConnection() //打开COM1
{
COMMTIMEOUTS TimeOuts;
if(m_bConnected)
return FALSE;
m_bConnected = true;
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); // 非重叠方式
if(m_hCom==INVALID_HANDLE_VALUE)
return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
SetCommMask(m_hCom, EV_CTS|EV_DSR|EV_RLSD);
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
/* 设置写超时以指定WriteComm成员函数中的
GetOverlappedResult函数的等待时间*/
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
if(!ConfigConnection())
{
CloseHandle(m_hCom);
return FALSE;
}
return TRUE;
}
void SendDlg::CloseConnection() //关闭COM1
{
if(!m_bConnected)
return;
m_bConnected=false;
CloseHandle(m_hCom);
}
DWORD SendDlg::ReadComm(unsigned char *buf,DWORD dwLength)
{ //读COM1一字节
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength, ComStat.cbInQue);
ReadFile(m_hCom,buf,length,&length,NULL);
return length;
}
DWORD SendDlg::WriteComm(unsigned char buf,DWORD dwLength)
{ //写COM1一字节
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osWrite;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
fState=WriteFile(m_hCom,&buf,length,&length,NULL);
if(!fState)
{
if(GetLastError()==ERROR_IO_PENDING)
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// 等待
else
length=0;
}
return length;
}
void SendDlg::OnRadio1()
{
m_nBaud = 4800;
m_Baud = 0;
}
void SendDlg::OnRadio2()
{
m_nBaud = 9600;
m_Baud = 1;
bool SendDlg::SendData(int &w) //发送数据
{
if(!OpenConnection())//连接出错
{
CloseConnection();
return false;
}
for(int y=0;y<2;y++) //发送信号中断单片机
{
WriteComm(num,1);
}
if(ComStat1.cbInQue)//有信号发送
{
ReadComm(ReadCom1V,1);
...
}
CloseConnection();
return false;
}
}