我想自己做一个MFC小工具,功能可以概括为"简易版secureCRT";
现在串口已经通过CreateFile()连接成功,超时、奇偶校验、波特率这些设置貌似也没有问题了。
接下来,我如何得到linux的login:和password:提示符并把用户名root和密码发出去?如何远程打开一个终端从而可以向内核发送linux命令(比如ls、cd这些)?
贴上部分代码吧:
BOOL Cserial_comm_win_1Dlg::OnInitDialog(){
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
hCom=CreateFile(_T("\\\\.\\COM19"), //COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL, //引用安全性属性结构,缺省值为NULL
OPEN_EXISTING, //打开而不是创建
0, //同步方式 0
NULL);
if(hCom==(HANDLE)-1){
AfxMessageBox(_T("打开COM失败!"));
return FALSE;
}
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD; //在读一次输入缓冲区的内容后读操作就立即返回,而不管是否读入了要求的字符。
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=115200; //波特率为9600 !!!!!!!!!!!!
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=1; //TWOSTOPBITS两个停止位 !!!!!!!!!!!!!!!
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//清除串口句柄的输入输出缓冲区
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void Cserial_comm_win_1Dlg::OnBnClickedButton1(){//“发送”按钮
// TODO: 在此添加控件通知处理程序代码
CString command;
GetDlgItemText(IDC_EDIT1,command);
char lpOutBuffer[100];
memset(lpOutBuffer,0,100);
int strLength= command.GetLength() + 1;
strncpy(lpOutBuffer,command,strLength);
DWORD dwBytesWrite=100;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat){
AfxMessageBox(_T("写串口失败!"));
}
}
void Cserial_comm_win_1Dlg::OnBnClickedButton2(){//“接收”按钮
// TODO: 在此添加控件通知处理程序代码
char str_s[100];
memset(str_s,'\0',100);
DWORD wCount=100;//读取的字节数
BOOL bReadStat;
bReadStat=ReadFile(hCom,str_s,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox(_T("读串口失败!"));
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
CString str;
str=str_s;
SetDlgItemText(IDC_EDIT1,str);
UpdateData(FALSE);
}