串口数据错误问题

gszgdgszgd 2009-06-23 09:57:37
编写了一个接受设备信号的串口程序,波特率是38400。一开始的时候数据显示正常。但程序运行一段时间,界面上的数据刷新就会缓慢,最后停止。这是界面上的问题,还是数据传输的问题,在刷新停止的时候,我的这个数据还有没有进行内部的运算。这个问题怎么解决啊。小弟初来乍到,谢谢大家了。
...全文
379 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmm_study 2012-07-17
  • 打赏
  • 举报
回复
你这个串口通信程序现在写完了吧,我现在也遇到这个问题了,我找到是显示的原因,我原来也是用UpdateDate(FALSE),后来查到它执行起来很耗时,它调用了DoExchangeData()这个函数。我目前没好的解决办法,还请 你帮帮忙
summersunboy 2009-06-24
  • 打赏
  • 举报
回复
算了 哥给你远程登录 瞄瞄
悟迟 2009-06-23
  • 打赏
  • 举报
回复
“界面上的数据刷新就会缓慢”,啥样的界面呢?我猜你是解析计算完后用GDI画出来的,猜对没
“在刷新停止的时候,我的这个数据还有没有进行内部的运算”,“刷新”是啥,“数据还有没有进行内部的运算”收到的原始数据,还没解析计算?
gszgdgszgd 2009-06-23
  • 打赏
  • 举报
回复
是拿MSCom写的。
峰白 2009-06-23
  • 打赏
  • 举报
回复
你是用Edit显示的数据么?

如果显示的数据过多的话就会出现你说的现象,你可以做下测试,比如显示的字符超过某个界限就进行清空(比如500个字符)

然后看下程序运行情况,会不会还出现死的情况。
NTooL 2009-06-23
  • 打赏
  • 举报
回复
用控件做的,还是用API写的,贴出来看看。
路人乙2019 2009-06-23
  • 打赏
  • 举报
回复
贴接收代码.
悟迟 2009-06-23
  • 打赏
  • 举报
回复
没啥想法,要是楼主也没啥想法的话,可以试着将所有解析计算等代码屏蔽掉,Edit用随机数填充,获得数据后直接更新界面。如果不会出现之前现象,那再看解析计算部分的代码吧?
gszgdgszgd 2009-06-23
  • 打赏
  • 举报
回复
给大家解释下,没有那么高深,就是拿Dialog生成了一个界面,然后用Edit显示接收的数据,刚我做了下测试,因为串口通信的速率较快,所以正常的时候,那个Edit里面得数是不停的变化的。但是程序运行了一段时间的话。而且这个时间是随机的,有时候10多分钟,有时候1个小时。Edit里面的数就不怎么跳动了。串口都是用事件触发,每收到一串数,我就用UpdateData(FALSE)刷新一次。而且我现在认为他不是界面的问题,因为我这个程序写的时候还有记录的功能,我发现在edit刷新速度慢的时候,其实内部的数据就是这样的。我不明白是内部数据的错误导致的edit刷新速度慢,还是edit刷新速度慢导致的内部数据计算出现错误。这里把部分代码贴出来。大家帮忙看下。谢谢了啊

void CSCommTestDlg::OnComm() //在顶部没有声明的变量均为全局变量
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k,j;
//data_wholeadd
countangle++;
double ana_volt;//,angle
int data_whole,data_sum,data_sum_check;
data_sum=0;
data_sum_check=0;
BYTE rxdata[2048]; //设置BYTE数组
int data_block[8]={0,0,0,0,0,0,0,0};
int i=0;
int CountMin,CountSec;
const int FixTime=108000;
int data_block_int[8]={0,0,0,0,0,0,0,0};
float con_current, dia_signal,sup_voltage;
static int xdata_whole[1];
float Ku=0.25;
int Kl=10, Kd=1;


if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组



for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(rxdata+k); //字符型
//strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
if (bt==0xdd)
{
for(j=0;j<8;j++)
{
data_block[j]=*(rxdata+k+j);
//data_block_int[j]=data_block[j];

//get the whole data structure
}
k=k+7;

}
//整理数据顺序

if (data_block[2]>=0x80)
{

data_whole=0xff000000;
data_whole+=(unsigned int)data_block[1]<<0;
data_whole+=(unsigned int)data_block[2]<<16;
data_whole+=(unsigned int)data_block[3]<<8;

}

else
{
data_whole=0;
data_whole+=(int)data_block[1]<<0;
data_whole+=(int)data_block[2]<<16;
data_whole+=(int)data_block[3]<<8;
}


data_sum_check+=data_block[6]<<8; //提取校验位
data_sum_check+=data_block[7];

for(int l=1;l<6;l++)//校验位计算
data_sum+=data_block[l];


}




switch (data_block[4])//Xdata的运算
{
case 0x00: xdata_whole[0]=(unsigned int)data_block[5]<<8;


break;

case 0x01: xdata_whole[0]=xdata_whole[0]+(unsigned int)data_block[5];


break;

default: break;

}

data_wholeadd=data_whole;


if(abs(data_wholecheck-data_wholeadd)>100000||data_sum_check!=data_sum)
data_wholeadd=data_wholecheck;


data_wholecheck=data_wholeadd;


if(data_sum_check==data_sum)
temperature=((xdata_whole[0]*250)/(pow(2,15))-50);


//sup_voltage=(xdata_whole[1]*2.5)/(pow(2,15))/Ku;
//con_current=(xdata_whole[2]*2.5)/(pow(2,15))/Kl;
//dia_signal=(xdata_whole[3]*2.5)/(pow(2,15))/Kd;


switch(countsf)

{
case 0 :
sf=0.024;
countsf++;
ana_volt=(2.5*data_wholeadd)/8388608;
angle=(ana_volt)/sf;
sf=0.024*(1-0.0005*temperature)*(1-0.075*(angle/80)*(angle/80));
angle1=(angle-angle_ave)/300;
angle_add1+=angle1;
countsf=1;

break;


case 1 :
ana_volt=(2.5*data_wholeadd)/8388608;
angle=(ana_volt)/sf;
sf=0.024*(1-0.0005*temperature)*(1-0.075*(angle/80)*(angle/80));
angle1=(angle-angle_ave)/300;
angle_add1+=angle1;


break;
}


switch (countave) //初试平均值计数

{
case 100: angle_ave=0;
angle_add=0;
countave++;
break;

case 1600: angle_ave=angle_add/1500;
countave++;
break;

default: angle_add+=angle;
countave++;
break;

}


CountSec=countangle/300; //时间转化
CountMin=countangle/18000;
if(CountSec>60)
CountSec=CountSec-60*CountMin;


if(angle_add1<0) //角度转化
angle_add1=360+angle_add1;
else if(angle_add1>360)
angle_add1=360-angle_add1;




m_EDITtemperature=temperature;
m_EDITmin=CountMin;
m_EDITsec=CountSec;
m_EDITangle=angle;
m_EDITsf=sf;
m_EDITcount=countangle;
m_EDITangle_add=angle_add1;
m_EDITangle_ave=angle_ave;
//m_EDITsupvoltage=sup_voltage;
//m_EDITconcurrent=con_current;
//m_EDITdiasignal=dia_signal;

if(angleabo>1)
angle_system=angle_add1;
else
angle_system=CompassAve;


UpdateData(FALSE);
}//end if

}

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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