mfc串口界面,参考龚建伟老师进行改写,接受开发板内核信息,存在延时现象

chnchm 2016-07-21 01:56:44
各位论坛好友,大家好,真心求帮忙!
我这边项目需要,参考龚建伟老师SCOMMV2.3串口调试助手,改写了一个串口调试,需要对开发板进行操作,波特率设置115200;改写的串口界面,接受数据存在延时;即使给开发板断电后,仍然过一段时间才停止接受数据,而不是立刻停止。这样延时现象,我不容易通过设计的串口界面,按任意键进入系统uboot进行更进一步操作开发。
这个软件是结合项目设计的,延时现象困扰了1周了,网上说有用线程处理的,但不熟悉,求帮忙指点。
串口接受数据核心代码如下,使用CSerialPort类编写的串口,帮忙分析下哪里有问题,谢谢各位了:

static long rxdatacount=0; //该变量用于接收字符计数
LONG CSCOMMDlg::OnCommunication(WPARAM ch, LPARAM port)//通信,消息响应
{ //定义变量:接受字符ch和端口port
if (port <= 0 || port > 11) //port代表串口号,取值1-10
return -1;
rxdatacount++; //接收的字节计数
CString strTemp;
strTemp.Format("%ld",rxdatacount);//输出长整型的接收数据计数rxdatacount
strTemp="RX:"+strTemp;
//m_ctrlRXCOUNT.SetWindowText(strTemp); //显示接收计数

if(m_bStopDispRXData) //如果选择了“停止显示”接收数据,则返回
return -1; //注意,这种情况下,计数仍在继续,只是不显示
//若设置了“自动清空”,则达到50行后,自动清空接收编辑框中显示的数据
if((m_ctrlAutoClear.GetCheck())&&(m_ctrlReceiveData.GetLineCount()>=50))//程序打开,默认选择自动清空
{
m_ReceiveData.Empty();
UpdateData(FALSE);
}

//如果没有“自动清空”,数据行达到400后,也自动清空
//因为数据过多,影响接收速度,显示是最费CPU时间的操作
if(m_ctrlReceiveData.GetLineCount()>400)
{
m_ReceiveData.Empty();//数据超过400行,清空界面
m_ReceiveData="***The Length of the Text is too long, Emptied Automaticly!!!***\r\n";
UpdateData(FALSE);
}

CString str; //将字符送入临时变量str存放
str.Format("%c",ch); //字符格式进行显示

//以下是将接收的字符加在字符串的最后,这里费时很多
//但考虑到数据需要保存成文件,所以没有用List Control
int nLen=m_ctrlReceiveData.GetWindowTextLength();//返回指定窗口的标题文本的字符长度
m_ctrlReceiveData.SetSel(nLen, nLen); //在编辑控件选择一定范围的字符
m_ctrlReceiveData.ReplaceSel(str); //注释后,窗口不接受数据
nLen+=str.GetLength();
m_ReceiveData+=str; //将临时变量str存放的字符,加入到接收框

return 0;

}

...全文
660 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinlj0 2016-07-24
  • 打赏
  • 举报
回复
不要浪费时间研究NT5.1内核(包括正版XP和盗版Win7)的串口功能了,被回教做了手脚。 由于NT6内核已经发布,NT5.1内核逐步停止维护了。 上海方正处可能拷贝得到正版Windows 6、SDK及配套编译器。
chnchm 2016-07-23
  • 打赏
  • 举报
回复
嗯,115200的波特率,接收4418主板内核信息输出,数据量有些大;分析发现,mfc串口界面的窗口显示的数据存在延时,比接收的数据较慢,不能实现数据显示与接收同步,这样就不方便操作串口界面进入uboot做进一步开发了。像secureCRT这种串口,就不存在延时,操作方便;但我的串口界面给项目用的,需要额外添加其他功能,内核信息显示只是其中一部分,需要自行设计。 将串口的数据接收和显示分开处理,使用线程如何处理,可以给些参考代码或提示吗,谢谢! 串口初始化代码如下: BOOL CSCOMMDlg::OnInitDialog()//初始化设置 { //CDialog::OnInitDialog(); //BOOL b = CDialog::OnInitDialog(0,fdAll,true); BOOL b = CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here //CurSel,即current selection,当前选项 m_Com.SetCurSel(0); //串口选择第一个,即为com1 m_Speed.SetCurSel(11); //波特率case为11对应115200 m_Parity.SetCurSel(0); //校验位选择 m_DataBits.SetCurSel(0);//数据位选择 m_StopBits.SetCurSel(0);//停止位选择 m_hIconRed = AfxGetApp()->LoadIcon(IDI_ICON_RED); m_hIconOff = AfxGetApp()->LoadIcon(IDI_ICON_OFF); m_hIconGreen= AfxGetApp()->LoadIcon(IDI_ICON_GREEN); // m_ctrlIconDatareceive.SetIcon(m_hIconOff); //对这些串口变量赋初值 m_nBaud=115200; //设置波特率 m_nCom=1; //设置端口 m_cParity='N'; m_nDatabits=8; m_nStopbits=1; m_dwCommEvents = EV_RXFLAG | EV_RXCHAR; //串口事件 //if (m_Port.InitPort(this, 1, 9600,'N',8,1,dwCommEvents,512)) CString strStatus; //if(),如果启动串口成功 if (m_Port.InitPort(this, m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,1024)) { m_Port.StartMonitoring();//启动监测辅助线程 //打印串口状态及参数 strStatus.Format("COM%d OPENED,%d,%c,%d,%d",m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits); m_ctrlIconOpenoff.SetIcon(m_hIconRed); //m_ctrlIconOpenoff.SetIcon(m_hIconOff); //"当前状态:串口打开,无奇偶校验,8数据位,1停止位"); } else //如果启动失败 { AfxMessageBox("没有发现此串口"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); } m_ctrlPortStatus.SetWindowText(strStatus);//显示strStatus的字符:COM%d OPENED, CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_CYCLETIME);//IDC_EDIT_CYCLETIME为自动发送周期 控件 CString strText; strText.Format("%d",m_nCycleTime); //m_nCycleTime为1000ms pEdit->SetWindowText(strText); //Display cycle time //m_strSendData="http://www.gjwtech.com"; char cr=13,lf=10;; m_strSendData+=cr+lf; m_ctrlAutoClear.SetCheck(1); m_ctrlEditSendFile.SetWindowText("No File Selected!"); m_animIcon.SetImageList(IDB_ANIM_IMGLIST,4,RGB(0,0,0)); SetTimer(4,200,NULL); UpdateData(FALSE); ShowWindow(SW_SHOW); // return TRUE; // return TRUE unless you set the focus to a control return b; }
zgl7903 2016-07-22
  • 打赏
  • 举报
回复
数据量大的话 建议不要单字消息, 效率很低下, 尽量批量读和处理; 如果用消息机制,也推荐块传输方式 比如 OnComm(BYTE *pDataBuff, int iBuffBytesLen, int iPort)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧